擅长:python、mysql、java
<p>问题与<code>n</code>是字典无关;问题在于<code>n</code>是类属性而不是实例属性。这意味着类的所有实例共享一个值。你知道吗</p>
<p>解决方法是将其转换为实例变量,并在方法(通常是<code>__init__</code>方法)中分配它,而不是在类定义中。你知道吗</p>
<pre><code>class A(object):
def __init__(self):
self.n = {}
</code></pre>
<p>你可能会问为什么同样的事情不会发生在<code>a</code>。嗯,确实是这样。您正在创建一个共享的<code>a</code>,就像<code>n</code>。你知道吗</p>
<p>但是您不能对共享的<code>a</code>调用任何改变它的方法(事实上,您不能,因为<code>int</code>是不可变的;它没有任何改变它的方法)。在<code>n</code>中,<code>self.n[key] = object</code>看起来可能不像方法调用(实际上是<code>self.n.__setitem__(key, object)</code>),但很明显,它正在就地更改<code>n</code>的值,这是这里的关键。你知道吗</p>
<p>你只是给<code>self.a</code>赋值。这将创建一个新的实例属性,该属性会对同名的class属性进行阴影处理,这很容易混淆,但它可以按照您的要求工作。如果您只需要构建一个新值并将其赋给<code>self.n</code>,就可以获得与<code>n</code>相同的行为:</p>
<pre><code>def add(self, key, obj):
new_n = copy.copy(n)
new_n[key] = obj
self.n = new_n
</code></pre>