Why does += operator work differently than + and assign operator for python dictionary?
有人能解释一下这种行为吗?
1 2 3 4 5 6 7 8 9 10
| >>> 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
>>> |
- listobj += something与listobj.extend(something)相同,后者取任何不可数。list(dict)是密钥列表。
- @马蒂:当然,但这并不能解释为什么不允许将dict明确添加到list中。
- @艾布拉姆斯:是的,是的。listobj +=和list +不是一回事。
- @艾布拉姆斯是的。第一个例子是向列表中添加字典。第二个示例是将字典的键添加到列表中。它第二次运行是因为它得到的是字典的键而不是实际的字典
- @伊格纳西奥瓦兹奎兹·艾布拉姆斯:我联系的那个dupe本身就是dupe,但最终的目标并不能解释list.__iadd__是list.extend()的代理。
- @海德罗:在这两种情况下,dict都被传递给适当的方法。
- @Martijnpieers认为他们可以是不同的事物并不能解释为什么List在这两种情况下选择做不同的事情(即为什么它不接受+的任意iTerables)。然而,这是一个不同的问题(以前也有人问过,IIRC)。
- 相关:在python中,"i+=x"与"i=i+x"什么时候不同?
- @德尔南:以前有人问过,我想我还能找到它。
- @MartijnPieers是stackoverflow.com/q/13905008/395760,但我想在结束这个问题之前得到OP的确认,作为这个问题的副本。
- 更好的重复目标:列表扩展奇怪的行为,列表的不同行为。uud_uuuu和list。uuu添加_uuuu为什么添加到列表做不同的事情?
- @德尔南我同意这几乎是在问与上述问题相同的问题。请把它标为关闭。
因为a = a + b和a += b不是一回事。前者调用__add__1(并进行常规分配,不能超负荷),而+=调用__iadd__(也进行常规分配,但只允许在__iadd__未执行时返回__add__。列表用不同的语义定义两者;__add__创建一个新的列表,并要求两个操作数都是列表,而__iadd__本质上是.extend(),因此(1)在任何不可数上工作,(2)在适当的位置改变列表。
在某些情况下是1或__radd__,但我正在掩盖这一点,因为它不会真正影响本例的结果。
- "别问为什么决定这样做。"这正是他所做的。
- @伊格纳西奥瓦兹奎兹·艾布拉姆斯在这种情况下,这是一个不同问题的复制品,见我在问题评论中与马丁·皮特斯的讨论。但我还没有这样读这个问题,OP可以自由澄清。