我面对这种奇怪的行为,我找不到解释
MWE:
l = [1]
l += {'a': 2}
l
[1, 'a']
l + {'B': 3}
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: can only concatenate list (not "dict") to list
基本上,当我+=
时,python不会引发错误并将键追加到列表中,而当我只计算+
时,我会得到预期的TypeError
注意:这是Python 3.6.10
因此,正如作者所说,这不是一个bug。当你做
a += b
的时候,它就像b
来到a
的房子,改变它a
喜欢的样子作者所说的是,当你这样做时a + b
无法决定哪种风格会被优先考虑。没有人知道a + b
的结果将走向何方,除非您执行它。所以你无法决定这是谁的风格。如果是a
样式,则为[1, 'a']
样式,如果是b
样式,则为错误。因此无法决定谁将获得优先权。所以我个人不同意这种说法。因为在调用堆栈时a
比b
位于更高的位置。当有一个像a + b
这样的表达式时,如果a.__add__
是NotImplemented
(在本例中它是实现的),则首先调用a.__add__(self, other)
。然后调用a.__radd__(self, other)
。这意味着在本例中调用other.__add__
。我是根据调用堆栈的位置来讲述这一点的,python社区可能有更重要的理由这样做l += ...
实际上是在调用object.__iadd__(self, other)
并在l
可变时修改对象in-place
原因(正如@DeepSpace在他的评论中解释的)是,当您执行
l += {'a': 2}
操作时,仅当l
是可变的时,操作才会更新l
。另一方面,操作l + {'a': 2}
未到位,导致list + dictionary -> TypeError
(见here)
与调用
object.__add__(self, other)
的+
不同相关问题 更多 >
编程相关推荐