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

请求解析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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:47:23