<p>我将把你的例子扩展一下</p>
<pre><code>class Bag:
items = []
items1 = []
val = 100
def add(self, x):
self.items.append(x)
self.val += 1
self.items1 += [x]
b1 = Bag()
print(Bag.__dict__)
#op-1>>> 'items': [], 'items1': [], 'val': 100,
print(b1.__dict__)
#op-2>>> {}
b1.add(111)
print(Bag.__dict__)
#op-3>>> {'items': [111], 'items1': [111], 'val': 100}
print(b1.__dict__)
#op-4>>>{'items1': [111], 'val': 101}
</code></pre>
<p>循序渐进:</p>
<ol>
<li><p><code>self.items.append(x)</code>:</p>
<p>首先,python尝试查找在<code>object (self.__dict__)</code>中是否有<code>items</code>,如果没有,则尝试从类作用域中查找<code>items</code>,并附加它。此表达式不返回任何内容。<code>self.__dict__</code>在这个表达式之后是不变的。</p></li>
<li><p><code>self.val += 1</code></p>
<p>这是int的扩充赋值。因此<code>__iadd__</code>将被调用,如果没有实现,则<code>__add__</code>将被调用,它将始终返回一个新的int。旧的int不会更改,因为它是不可变的。详细说明</p>
<p>你知道吗自我价值= 自我价值+1个</p>
<p><code>rhs</code>上的<code>self.val</code>第一次引用class属性<em>(因为b1.<strong>dict</strong>没有这个属性)</em>,它创建了一个新的int,这个int现在存储在对象的<code>__dict__</code>(因为lhs)。。在<code>rhs</code>中的第二次<code>self.val</code>引用了<code>self.__dict__</code>中的val,如果您本想做<code>Bag.val += 1</code>,那么它将始终操作类变量(就像您的第二个示例)</p></li>
<li><p><code>self.items1 += [x]</code></p></li>
</ol>
<p>所以这也是<code>list.__iadd__</code>的增加。<code>self.items1</code><strong>对可变序列进行适当更改,对同一列表的引用也作为此表达式的一部分返回。因此,在这个语句之后,您应该看到<code>self.__dict__</code>将包含<code>items1</code>,但内容与<code>Bag.__dict__['items1']</code>相同。你知道吗</p>
<p>你的第二个例子完全不同:</p>
<pre><code>cls.cl_roll += 1
</code></pre>
<p>此语句始终操作类变量。你知道吗</p>