通常,这始终是可变性的问题,尤其是运算符重载。C ++并不更好。
该表达式
a +b从绑定到
a和的对象(
b未修改)计算一个新列表。将其分配回时
a,您将更改一个变量的绑定以指向新值。预计这
+是对称的,因此您无法添加字典和列表。
该语句
a +=b修改绑定到的现有列表
a。由于它不会更改对象标识,因此更改对表示的对象的所有绑定都是可见的
a。运算符
+=显然不是对称的,它等效于
list.extend,它在第二个操作数上进行迭代。对于字典,这意味着列出密钥。
讨论:
如果对象没有实现
+=,则Python将使用
+和将其转换为等效语句
=。因此 , 这 有时是等效的, 具体取决于所涉及对象的类型。
+=更改引用对象(与作为引用的操作数值相反)的a的好处是,在不相应增加实现复杂性的情况下,实现可以更高效。
在其他语言中,您可能会使用更明显的表示法。例如,在没有操作符重载的虚拟版本的Python中,您可能会看到:
a = concat(a, b)
与
a.extend(a, b)
操作符实际上只是这些的简写。
奖金:
也可以尝试其他可迭代对象。
>>> a = [1,2,3]>>> b = "abc">>> a + bTraceback (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']
能够执行此操作很有用,因为您可以将生成器附加到带有的列表中
+=并获取生成器内容。不幸的是,它破坏了与的兼容性
+,但是很好。



