请求解析Python两种场景下for循环的行为差异
Python for循环两种场景行为差异的本质原因
这两种场景的差异和for循环是否操作副本无关,核心在于可变对象与不可变对象的特性,以及你对循环变量执行的是「修改对象本身」还是「重新绑定变量」操作。
场景1:操作可变对象的属性
代码:
class Person: height = 100 people = [] for i in range(2): people.append(Person()) for i in people: print(i.height) for i in people: i.height += 20 for i in people: print(i.height)
运行结果:
100 100 120 120
原因解释:
Person的实例是可变对象,循环中的i是直接指向列表内Person实例的引用(并非副本)。i.height += 20是直接修改该实例对象的内部属性——这个操作没有改变i指向的对象,只是修改了对象本身的状态。因此列表中存储的原实例会同步更新,最终输出的就是修改后的值。
场景2:操作不可变对象的重新绑定
代码:
b = [1, 2, 3] for i in b: i += 5 print(b)
运行结果:
[1, 2, 3]
原因解释:
- 列表中的
1、2、3是不可变的整数对象,循环中的i是指向这些整数对象的引用。 i += 5等价于i = i + 5:由于整数不可变,这个操作不会修改原来的整数对象,而是创建一个新的整数对象(比如1+5=6),然后将i重新绑定到这个新对象上。但列表中存储的还是原来的整数对象的引用,所以列表本身不会发生变化。
核心总结
- 场景1:修改可变对象的内部状态,操作直接作用于原对象,因此列表元素会更新。
- 场景2:对不可变对象执行重新绑定,仅改变循环变量的指向,未修改列表内的原对象,因此列表无变化。
内容的提问来源于stack exchange,提问作者amir alamir
相关产品推荐
相关产品推荐

