迭代列表时将其重新赋值为[],为何循环仍会完整执行?
为什么遍历列表时重新赋值为空列表,for循环仍会完整执行?
先看你给出的代码:
def iterate(l): for x in l: l = [] print(x) iterate([1, 2, 3]) # prints 1 2 3
核心原因是Python的for循环依赖迭代器,且迭代器在循环启动时就已绑定原列表对象,和后续变量的重新赋值无关,具体拆解:
- 当调用
iterate([1,2,3])时,函数参数l最初指向内存中的[1,2,3]列表对象。 - 进入
for x in l循环时,Python会先执行iter(l),把l当前指向的列表转换成一个迭代器。这个迭代器直接绑定的是原[1,2,3]的内存空间,不是变量l本身。 - 第一次循环取出元素1后,执行
l = [],这只是把变量l的指向改成了一个新的空列表对象,但之前创建的迭代器还牢牢绑定着原来的[1,2,3],所以后续循环还能从迭代器里取出2和3。 - 调试时看到
l变成空列表,是因为变量已经指向新对象了,但原列表还被迭代器引用着,只是你没法再通过变量l访问它。
额外补充:如果是直接修改原列表对象(比如l.clear()或者del l[:]),迭代器就会受影响,循环会提前终止——因为这时候修改的是迭代器绑定的那个对象本身,迭代器能感知到内容变化。但你这里是重新赋值变量,相当于换了个新对象给l,和原列表完全没关系了。
内容的提问来源于stack exchange,提问作者barciewicz
相关产品推荐
相关产品推荐

