11

考虑以下:

>>> t = ([],)
>>> t[0].extend([12, 34])
>>> t
([12, 34],)
>>> t[0] += [56, 78]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
([12, 34, 56, 78],)
>>> 

我知道元组是不可变的,但是LHS 中的项目不是元组! (尽管有错误消息,预期的分配实际上成功了,这使得整个场景更加奇怪。)

为什么这种行为不被视为错误?

4

2 回答 2

8
t[0] += [56, 78]

简称

t[0] = t[0].__iadd__([56, 78])

元组在哪里t。该t[0].__iadd__([56, 78])部分更改列表,但结果无法存储为t[0].

Python 中的 LHS 始终是一个名称,而不是一个值。在每个 Python 表达式中,RHS 被评估为一个值并分配给 LHS 上的名称。在这种情况下,t[0]无法分配名称,因为t它是一个元组。

于 2013-06-21T01:38:16.597 回答
2

这在 Python FAQ 中有记录和解释。

如需完整讨论,请阅读常见问题解答条目。但简而言之,问题在于这段代码:

t[0] += [56, 78]

……相当于:

t[0] = t[0].__iadd__([56, 78])

__iadd__成功list就地修改,并返回自身;然后分配引发异常。

不被认为是一个错误+=,因为它是,list.__iadd__tuple所有工作方式的不可避免的结果。虽然对于不理解这三件事的人来说并不明显,但任何改变事情的尝试对于理解这三件事的人来说都是不明显的并且可能会破坏许多其他更重要的案例)。

于 2013-06-21T01:53:52.797 回答