You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:42:40