有人可以向我解释这个python行为吗?

时间:2014-06-27 15:09:40

标签: python

有人可以解释这种行为吗?当我运行代码时,它打印10,然后是20.为什么list_of_classes被更改,即使我只更改了bob的值?我不应该用新值更新列表吗?

class wooo():
    def __init__(self,x,y,name):
        self.x=x
        self.y=y
        self.name=name

bob=wooo(10,10,"bob")
joe=wooo(10,10,"joe")
list_of_classes=[bob,joe]
print(list_of_classes[0].x)
bob.x=20
print(list_of_classes[0].x)

实际输出

10
20

预期产出

10
10

1 个答案:

答案 0 :(得分:7)

您的列表包含对象的引用,而不是副本。

list_of_classes[0]是对bob引用的同一对象的引用。您可以创建对同一对象的更多引用,并且通过所有这些引用可以看到属性更改:

>>> class wooo():
...     def __init__(self,x,y,name):
...         self.x=x
...         self.y=y
...         self.name=name
... 
>>> bob=wooo(10,10,"bob")
>>> guido = bob
>>> guido.x
10
>>> guido.x = 20
>>> bob.x
20
>>> guido is bob
True

如果您想要将类的副本添加到列表中,请使用copy module创建实例的深层副本:

>>> import copy
>>> robert = copy.deepcopy(bob)
>>> robert.x
20
>>> bob.x = 30
>>> robert.x
20
>>> robert is bob
False