python3可变属性共享吗?

2024-05-20 03:42:27 发布

您现在位置:Python中文网/ 问答频道 /正文

在我实例化同一类的两个不同对象的代码中,object1如何可能改变object2的属性?我怎样才能保持与众不同”自变的“变量?我的错在哪里?:-)

谢谢

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'}

Tags: 对象实例key代码selfvaluedefchange
1条回答
网友
1楼 · 发布于 2024-05-20 03:42:27

您已经在类级别上定义了mutableimmutable, 因此,在Class的所有实例中,两者都将是shared。链接问题中的答案详细解释了如何避免您所观察到的共享行为,因此我将仅解释您的代码发生了什么。你知道吗

原则上,这种共享与可变或不可变的属性无关,但是代码中的一些细微差别可能会使它变得混乱。你知道吗

mutable的情况下,观察到的行为很容易解释。你知道吗

首先,dictmutable在内存中总是同一个对象:

>>> o1, o2 = Class(), Class()                                                                         
>>> o1.mutable is o2.mutable is Class.mutable                                                         
True

当您以任何方式mutate可变时,这种变化将在引用该dict的任何地方都可以看到。你知道吗

>>> Class.mutable                                                                                     
{}
>>> o2.mutable[1] = 2                                                                                 
>>> o1.change()                                                                                       
>>> Class.mutable                                                                                     
{1: 2, 'key': 'value'}

到目前为止,所有这些都在预料之中。使用immutable最棘手的部分是,您不会在更改中变异Class.mutable,而是将属性mutable分配给正在调用的实例(selfchange!你知道吗

在调用change之前,immutable只存在于类级别,在实例o1o2上查找时通过类进行访问。(注意o1o2的实例dict是如何为空的。)

>>> o1, o2 = Class(), Class()                                                                         
>>> o1.immutable, o2.immutable, Class.immutable                                                       
(0, 0, 0)
>>> o1.__dict__, o2.__dict__, 'immutable' in Class.__dict__                                           
({}, {}, True)

o2上调用change时,只在实例o2上设置属性immutable = 1!你知道吗

>>> o2.change()                                                                                       
>>> o1.immutable, o2.immutable, Class.immutable                                                       
(0, 1, 0)
>>> o1.__dict__, o2.__dict__, 'immutable' in Class.__dict__                                           
({}, {'immutable': 1}, True)
>>> o1.immutable is Class.immutable                                                                   
True
>>> o2.immutable is Class.immutable                                                                   
False

理解在类级别设置的可变和不可变对象是以完全相同的方式共享的,这一点很重要。唯一的区别是可变对象上没有改变它们的方法。但是,如果您在change中执行了self.mutable = {'key': 'value'},然后在特定实例上调用了change,那么在实例上定义的mutable属性在通过点表示法查找实例时将优先于在类级别定义的属性。你知道吗

相关问题 更多 >