Python类中重复引用同一对象导致属性值全为9的原因?
为什么test方法中输出的color值全部为9?
核心问题出在c_TAIL类里的dot = c_DOT()是类级属性,不是实例属性——整个c_TAIL类只会创建这一个c_DOT实例,所有对self.dot的引用,指向的都是同一个对象。
具体执行过程拆解:
- 初始化
c_TAIL实例时,循环10次执行self.tails.append(self.dot),其实是把同一个c_DOT对象的引用重复添加了10次到tails列表里。 - 每次循环里的
self.tails[i].color = i,本质是在修改同一个c_DOT实例的color属性:第一次设为0,第二次覆盖成1……直到第十次设为9,这是最后一次修改。 - 初始化时的
print是在每次修改后立刻输出,所以能看到0到9的变化,但这些修改都是针对同一个对象的。等test方法执行时,遍历tails列表的所有元素,其实都是那个已经被改成9的c_DOT实例,自然全输出9。
修正方案
把dot改成实例级的,每次循环创建新的c_DOT对象,比如:
class c_TAIL: tails = [] def __init__(self) -> None: for i in range(10): # 每次循环新建一个c_DOT实例,而不是复用同一个 new_dot = c_DOT() new_dot.color = i self.tails.append(new_dot) print(new_dot.color) # 输出0-9 def test(self): for i in range(0, 10): print(self.tails[i].color) # 输出0-9
内容的提问来源于stack exchange,提问作者Nick Xasm
相关产品推荐
相关产品推荐

