我只是在翻译中玩弄并碰到了一些我不理解的东西。当我创建一个列表作为元素之一的元组,然后尝试更新该列表时,会发生一些奇怪的事情。例如,当我运行时:
tup = (1,2,3,[4,5])
tup[3] += [6]
我明白了:
TypeError: 'tuple' object does not support item assignment
这正是我的预期。然而,当我再次引用元组时,我得到:
>>> tup
(1, 2, 3, [4, 5, 6])
所以即使python引发异常,列表实际上也已更新。这是如何运作的?我无法想象我实际上想要做这样的事情,但我仍然想了解发生了什么。谢谢。
答案 0 :(得分:28)
这实际上记录在Python docs。
中编辑:这是一个摘要,这是一个更完整的答案。
+=
时,Python会对项目调用__iadd__
魔术方法,然后在后续项目分配中使用返回值。__iadd__
相当于在列表中调用extend
,然后返回列表。因此,当我们致电tup[3] += [6]
时,它相当于:
result = tup[3].__iadd__([6])
tup[3] = result
从#2开始,我们可以确定这相当于:
result = tup[3].extend([6])
tup[3] = result
extend
,并且由于列表是可变的,因此会更新。但是,后续分配失败,因为元组是不可变的,并抛出错误。