为什么下面的代码虽然成功了却抛出异常?
>>> t = ([1, 2, 3], 4)
>>> t[0] += [1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
([1, 2, 3, 1], 4)
>>>
最佳答案
在 IRC 上找到答案。
t[0] += [1]
是几个离散的 Action :
- 正在加载
t[0]
- 构建一个包含
1
的新列表 - 将
[1]
添加到任何t[0]
是 - 重新分配
t[0]
似乎 x += y
基本上是 x = x + y
(但是,是吗?)
棘手的一点是 +=
意味着对元组 t
和列表 t[0]
t[0] += [1]
不是 字面意思 t[0] = t[0] + [1]
,它是:t[0] = t[0].__iadd__([1])
真正发生的是:
__iadd__
都会改变列表并返回它。因此,列表(t
中的第一个元素)已经附加了1
。- 元组的变异也被尝试在原地,但元组是不可变的,导致异常。
为什么这不是显而易见的?因为像我这样的 n00b 会期望 t[0] += [1]
要么一起成功要么失败,因为它是 python 的一小行。但情况并非总是如此。
关于python - 元组:+= 运算符抛出异常,但成功了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38344244/