在代码中我示例化了同一个类的两个不同的对象,object1
怎么可能改变object2
的属性呢?我怎么能保留不同的“self.mutable”变量呢?我的错误在哪里呢?:-)
谢谢
class Class:
mutable = {}
immutable = 0
def change(self):
self.immutable = 1
self.mutable["key"] = "value"
def observe(self):
print(self.immutable, self.mutable)
object1, object2 = Class(), Class()
object1.change()
object2.observe()
# output is: 0 {'key': 'value'}
1条答案
按热度按时间oalqel3c1#
您已经在类级别上定义了
mutable
和immutable
,因此它们在Class
的所有示例中都将是shared。链接问题中的答案详细解释了如何避免您所观察到的共享行为,因此我将只解释您的代码中发生了什么。原则上,这种共享与属性是可变的还是不可变的无关,但是代码中存在一些细微差别,这可能会使它变得混乱。
对于
mutable
,观察到的行为很容易解释。首先,dict
mutable
在内存中始终是同一个对象:当您以任何方式改变
mutable
时,这个改变将在任何引用该dict的地方出现。到目前为止,所有这些都是意料之中的,
immutable
的棘手之处在于,你没有在change中改变Class.immutable
,而是将属性immutable
assign 给正在被调用的示例(self
)change
!在调用change之前,
immutable
只存在于类级别上,并且当在示例o1
或o2
上查找时,可以通过类访问immutable
(注意o1
和o2
的示例字典是如何为空的)。当在
o2
上调用change
时,您只在示例o2
上设置属性immutable = 1
!在类级别设置的可变对象和不可变对象是以完全相同的方式共享的,理解这一点很重要。唯一的区别是可变对象没有改变它们的方法。但是如果你在
change
中执行self.mutable = {'key': 'value'}
,然后在特定示例上调用change
,在示例上定义的mutable
属性在经由点标记法在示例上查找它时将优先于在类级别上定义的属性。