Python循环使用同名变量报错原因:迭代后变量值变更问题
为什么迭代变量和列表同名会导致后续报错?
这是个很典型的Python变量作用域问题,咱们把整个过程拆解开就能明白原因了:
首次执行代码的过程
假设你在REPL里输入的是这行逻辑(用分号分隔两行代码):
a = [1, 2, 3]; for a in a: print(a)
执行顺序是这样的:
- 先完成赋值:
a = [1,2,3],此时变量a指向的是列表[1,2,3]。 - 进入
for循环,这里的迭代变量也是a——Python里for循环的迭代变量会直接覆盖当前作用域里的同名变量:- 第一次循环:把列表的第一个元素
1赋值给a,打印1; - 第二次循环:把列表的第二个元素
2赋值给a,打印2; - 第三次循环:把列表的第三个元素
3赋值给a,打印3;
- 第一次循环:把列表的第一个元素
- 循环结束后,迭代变量
a并不会被销毁,它会保留最后一次赋值的结果——也就是整数3。这时候原来的列表对象已经没有变量指向它了(会被Python的垃圾回收机制处理),而a现在是个整数。
再次执行循环时报错的原因
当你再次执行for a in a: print(a)时,此时a的值是整数3。而for循环要求后面的对象必须是可迭代类型(比如列表、元组、字符串等),整数显然不是可迭代对象,所以就抛出了TypeError: 'int' object is not iterable的错误。
用其他迭代变量(比如i)正常的原因
如果改成:
a = [1,2,3]; for i in a: print(i)
循环结束后,迭代变量i会变成3,但原来的列表变量a并没有被覆盖,依然指向[1,2,3]。所以下次再执行for i in a: print(i)时,迭代的还是原来的列表,自然能正常运行。
简单来说:Python的for循环迭代变量会在当前作用域中保留最后一次的值,如果你不小心用了和迭代对象同名的变量,循环结束后这个变量就会被覆盖成迭代的最后一个元素,后续再用它作为迭代对象就会出错啦。
内容的提问来源于stack exchange,提问作者Priyan Selva
相关产品推荐
相关产品推荐

