python - 元组:+= 运算符抛出异常,但成功了吗?

标签 python tuples

为什么下面的代码虽然成功了却抛出异常?

>>> 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 :

  1. 正在加载t[0]
  2. 构建一个包含 1 的新列表
  3. [1] 添加到任何 t[0]
  4. 重新分配 t[0]

似乎 x += y 基本上是 x = x + y (但是,是吗?)

棘手的一点是 += 意味着对元组 t 和列表 t[0]

的赋值

t[0] += [1] 不是 字面意思 t[0] = t[0] + [1],它是:t[0] = t[0].__iadd__([1])

真正发生的是:

  1. __iadd__ 都会改变列表并返回它。因此,列表(t 中的第一个元素)已经附加了 1
  2. 元组的变异也被尝试在原地,但元组是不可变的,导致异常。

为什么这不是显而易见的?因为像我这样的 n00b 会期望 t[0] += [1] 要么一起成功要么失败,因为它是 python 的一小行。但情况并非总是如此。

关于python - 元组:+= 运算符抛出异常,但成功了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38344244/

相关文章:

python - 无法在 python 2.7 中迭代元组

Python:MySQL批量插入,跳过外键约束失败的条目

python - ObjectListView 使用逗号对整数进行排序和格式化?

python - 仅替换偶数次 re.sub() - Python 正则表达式

Python:在元组列表中,找到下一个元组的值时检索前一个元组的键?

python - 根据值对列表中的项目进行配对

python - 为什么在 Windows 终端中用 Python 进行彩色打印不起作用?

python - Python 的 ROUND_HALF_EVEN 应该如何处理小于 1 的小数?

scala - scala中调用map函数的不同方式

Python:从元组列表中提取元组