使用三元if语句更新数组值时首元素变为None的异常原因咨询
问题原因分析
这个问题的核心在于你误解了list.append()方法的返回值,同时三元表达式的赋值逻辑出现了偏差。
让我们一步步拆解代码的执行过程:
- 第一次迭代时,
a[0]是np.inf,满足a[0] == np.inf的条件,所以把100赋值给a[0],此时数组变成[100, 2, 3],这一步完全正常。 - 从第二次迭代开始,
a[0]已经是100,不再满足判断条件,于是进入三元表达式的else分支执行a.append(1)。但**list.append()是原地修改列表的方法,它的返回值是None**,你把这个None赋值给了a[0],这就导致数组第一个元素变成了None,同时数组末尾确实成功添加了1。 - 后续所有迭代里,
a[0]都是None,永远不会等于np.inf,所以每次都会执行a.append(1),并把返回的None重新赋值给a[0](哪怕此时a[0]已经是None),最终就出现了你看到的异常结果。
修正方案
你真正想要的逻辑应该是:当a[0]是np.inf时替换成100,否则在数组末尾添加1。不需要把append的结果赋值给a[0],用普通的if-else结构会更清晰,也能避免这个坑:
import numpy as np a = [np.inf, 2, 3] for i in range(0,10): if a[0] == np.inf: a[0] = 100 else: a.append(1) print(a)
这样执行后,第一次迭代把a[0]改成100,剩下的9次迭代每次给数组末尾加1,最终输出会是[100, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1],完全符合你的预期。
另外补充个小知识点:在Python中,所有原地修改列表的方法(比如append()、extend()、sort()、reverse()等),返回值都是None,这是很容易踩坑的细节哦。
内容的提问来源于stack exchange,提问作者nekovolta
相关产品推荐
相关产品推荐

