7

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

>>> 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
>>> 
4

1 回答 1

5

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

1或者__radd__在某些情况下,但我对此进行了掩饰,因为在这种情况下它并不会真正影响结果。

于 2013-10-16T09:19:55.953 回答