Python赋值运算符不同于非赋值运算符

2022-05-21 07:44:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我面对这种奇怪的行为,我找不到解释

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


Tags: inmostonlyinputlinecallcanlistfilelastmoduletracebackrecenttypeerrormwe
2条回答
网友
1楼 ·

因此,正如作者所说,这不是一个bug。当你做a += b的时候,它就像b来到a的房子,改变它a喜欢的样子作者所说的是,当你这样做时a + b无法决定哪种风格会被优先考虑。没有人知道a + b的结果将走向何方,除非您执行它。所以你无法决定这是谁的风格。如果是a样式,则为[1, 'a']样式,如果是b样式,则为错误。因此无法决定谁将获得优先权。所以我个人不同意这种说法。因为在调用堆栈时ab位于更高的位置。当有一个像a + b这样的表达式时,如果a.__add__NotImplemented(在本例中它是实现的),则首先调用a.__add__(self, other)。然后调用a.__radd__(self, other)。这意味着在本例中调用other.__add__。我是根据调用堆栈的位置来讲述这一点的,python社区可能有更重要的理由这样做

网友
2楼 ·

l += ...实际上是在调用object.__iadd__(self, other)并在l可变时修改对象in-place

原因(正如@DeepSpace在他的评论中解释的)是,当您执行l += {'a': 2}操作时,仅当l是可变的时,操作才会更新l。另一方面,操作l + {'a': 2}未到位,导致list + dictionary -> TypeError


(见here


l = [1]
l = l.__iadd__({'a': 2})
l
#[1, 'a']

与调用object.__add__(self, other)+不同

l + {'B': 3}
TypeError: can only concatenate list (not "dict") to list