问题 令人费解的“'元组'对象不支持项目分配”错误[重复]


这个问题在这里已有答案:


13165
2018-06-21 01:33


起源

为什么人们在使用Python常见问题解答前总是提出问题呢?在常见问题解答中,您将得到一个经过合理解释,精心编写并由多个核心开发人员审核的答案,并经得起时间的考验。在SO上,你会得到一个答案,有人在5分钟内拼凑在一起,在接下来的5分钟内反复编辑,然后在剩下的时间里放弃。你宁愿拥有前者吗? - abarnert
@abarnert,因为有无数种方式可以提问,google / stackoverflow结果远远超过搜索python.org。抛出最广泛的问题网络,当它失败时,提出问题通常会得到快速响应和积分。在许多情况下,其他更好的资源与之相关联,因此人们将被指向最佳答案来源。 - dansalmo


答案:


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 是一个元组。


8
2018-06-21 01:38





记录并解释了这一点 在Python FAQ中

有关完整的讨论,请阅读FAQ条目。但简单来说,问题是这段代码:

t[0] += [56, 78]

......等同于:

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

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

它的 不认为是一个bug,因为这是一个不可避免的后果 +=list.__iadd__,和 tuple 一切工作。虽然对于那些不理解这三件事情的人来说并不是很明显,但任何改变事物的尝试对任何人来说都是不明显的。 没有 理解(并且可能会破坏许多其他更重要的案例)。


2
2018-06-21 01:53