Python列表for循环中a=a+[]与a+=[]的差异及add和iadd的区别
关于Python中
+与+=(add与iadd)的差异及代码行为分析 两段测试代码
代码1:使用+操作
a = [1,2,3] for num in a: a = a + [num] print(a) # 输出:[1,2,3,1,2,3]
代码2:使用+=操作
a = [1,2,3] for num in a: a += [num] print(a) # 无输出(程序陷入死循环)
核心差异:add与iadd的本质区别
+对应__add__方法(add):执行时会创建并返回全新的列表对象,原列表不会被修改。变量会被重新赋值为这个新对象,和原列表不再关联。+=对应__iadd__方法(iadd):执行时直接修改原列表对象,不会创建新对象,所有操作都在原列表的内存空间里完成,变量始终指向同一个列表。
两段代码表现不同的原因
代码1的执行逻辑
for循环启动时,会基于初始的列表[1,2,3]创建一个迭代器,后续循环只会遍历这个初始列表的元素:
- 第一次循环:取初始列表的第一个元素1,执行
a = a + [1],a变为新列表[1,2,3,1],但迭代器仍按初始列表的元素顺序继续。 - 第二次循环:取初始列表的第二个元素2,a变为
[1,2,3,1,2]。 - 第三次循环:取初始列表的第三个元素3,a变为
[1,2,3,1,2,3]。 - 初始列表的元素遍历完毕,循环结束,执行
print(a)输出结果。
代码2的执行逻辑
for循环启动时同样基于初始列表创建迭代器,但+=是原地修改原列表:
- 第一次循环:取初始列表的第一个元素1,原列表被修改为
[1,2,3,1],列表长度从3变为4。 - 第二次循环:迭代器取下一个元素(初始列表的第二个元素2),原列表被修改为
[1,2,3,1,2],长度变为5。 - 第三次循环:迭代器取初始列表的第三个元素3,原列表被修改为
[1,2,3,1,2,3],长度变为6。 - 此时迭代器发现列表长度增加了,会继续遍历新添加的元素(刚加入的1、2、3),每次循环都会给列表再添一个元素,导致列表长度无限增长,循环永远无法结束,
print(a)永远不会被执行,因此无输出。
内容的提问来源于stack exchange,提问作者JWw
相关产品推荐
相关产品推荐

