Python列表迭代时的异常行为原因咨询
为什么两段Python循环代码的输出不同?
这是个很有意思的问题,核心在于Python的for循环迭代机制,以及变量赋值和对象修改的区别,咱们一步步拆解:
第一段代码:修改同一个列表对象
先看第一段代码:
num = [1, 2, 3, 4] for i in num: print(i) num[2] = 5
当你启动for循环时,Python会先从num指向的列表对象中创建一个迭代器,这个迭代器会一直绑定在这个原始列表上,循环过程中会不断从这个迭代器里取元素。
你在循环里执行num[2] = 5时,并没有改变num指向的对象——你只是修改了这个列表对象内部的元素值。所以当迭代器走到第三个位置时,取到的已经是修改后的5了,最终输出1 2 5 4。
第二段代码:创建了新的列表对象
再看第二段代码:
num = [1, 2, 3, 4] for i in num: print(i) num = [5 if j == 3 else j for j in num]
这里的关键是num = [5 if j ==3 else j for j in num]这行:列表推导式会创建一个全新的列表对象,然后把变量num重新指向这个新对象。
但注意:循环一开始创建的迭代器,是绑定在旧的列表对象(也就是最初的[1,2,3,4])上的,和后来重新赋值的num变量没有关系。迭代器只会遍历它一开始绑定的那个旧列表,所以即使你把num指向了新列表,迭代器还是会按旧列表的元素输出,结果就是1 2 3 4。
简单总结一下:
- 第一段是修改原对象的内容,迭代器能感知到变化;
- 第二段是让变量指向新对象,迭代器还是盯着旧对象不放。
内容的提问来源于stack exchange,提问作者Pranav
相关产品推荐
相关产品推荐

