<p>一般来说,这是而且一直是易变性的问题,尤其是运算符重载。C++没有更好的。</p>
<p>表达式<code>a + b</code>从绑定到未修改的<code>a</code>和<code>b</code>的对象中计算新列表。当您将此值赋回<code>a</code>时,您将更改一个变量的绑定以指向新值。预计<code>+</code>是对称的,因此不能添加dict和list。</p>
<p>语句<code>a += b</code>修改绑定到<code>a</code>的现有列表。由于它不会更改对象标识,因此对由<code>a</code>表示的对象的所有绑定都可见这些更改。运算符<code>+=</code>显然不是对称的,它相当于<code>list.extend</code>,它在第二个操作数上迭代。对于字典来说,这意味着列出键。</p>
<p><strong>讨论:</strong></p>
<p>如果一个对象没有实现<code>+=</code>,那么Python将使用<code>+</code>和<code>=</code>将其转换为等效语句。所以两者有时是等价的,</em>取决于所涉及的对象的类型。</p>
<p>使referrand发生变异的<code>+=</code>(与作为引用的操作数值相反)的好处是,在不相应增加实现复杂性的情况下,实现可以更高效。</p>
<p>在其他语言中,可以使用更明显的符号。例如,在没有运算符重载的假设Python版本中,您可能会看到:</p>
<pre><code>a = concat(a, b)
</code></pre>
<p>对</p>
<pre><code>a.extend(a, b)
</code></pre>
<p>运算符符号实际上只是这些的简写。</p>
<p><strong>奖金:</strong></p>
<p>你也可以和其他人一起试试。</p>
<pre><code>>>> a = [1,2,3]
>>> b = "abc"
>>> a + b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
>>> a += b
>>> a
[1, 2, 3, 'a', 'b', 'c']
</code></pre>
<p>能够做到这一点很有用,因为您可以将生成器附加到具有<code>+=</code>的列表并获取生成器内容。不幸的是,它破坏了与<code>+</code>的兼容性,但是哦,好吧。</p>