为什么+ =运算符的工作方式与+不同,并为python字典赋值运算符?

时间:2013-10-16 09:15:11

标签: python

有人可以解释一下这种行为:

>>> a = {'hello':'world' , 'good':'food'}
>>> b = [1,2]
>>> b = b + a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "dict") to list
>>> b += a
>>> b
[1, 2, 'good', 'hello'] <--- Why do the keys get added when dict cannot be added to a list
>>> 

1 个答案:

答案 0 :(得分:5)

因为a = a + ba += b不是一回事。前者调用__add__ 1 (并进行常规分配,不能重载),而+=调用__iadd__(并且还会定期分配,但仅限于在__add__未实施时允许回退到__iadd__。列表用不同的语义定义; __add__创建一个新列表,并要求两个操作数都是列表,而__iadd__本质上是.extend(),因此(1)适用于任何可迭代,(2)就地改变列表。

在某些情况下,

1 __radd__,但我对此表示赞赏,因为在这种情况下它并没有真正影响结果。