这个问题在这里已有答案:
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