【问题标题】:Puzzling "'tuple' object does not support item assignment" error [duplicate]令人费解的“'tuple'对象不支持项目分配”错误[重复]
【发布时间】:2013-06-21 01:33:56
【问题描述】:

考虑以下几点:

>>> t = ([],)
>>> t[0].extend([12, 34])
>>> t
([12, 34],)
>>> t[0] += [56, 78]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
([12, 34, 56, 78],)
>>> 

我知道元组是不可变的,但 LHS 中的项目不是元组!(事实上,预期的分配实际上成功了,尽管有错误消息,这使得整个场景更加奇怪。)

为什么这种行为不被视为错误?

【问题讨论】:

  • 为什么人们总是带着一个问题来 SO,然后再去 Python 常见问题解答?在常见问题解答中,您将得到一个经过推理、精心编写和多个核心开发人员审查的答案,并且经受住了时间的考验。在 SO 上,你会得到一个答案,有人在 5 分钟内一起拍打,在接下来的 5 分钟内反复编辑,然后在剩下的时间里放弃。你不想拥有前者吗?
  • @abarnert,因为有无数种方法可以提出问题,而且 google/stackoverflow 的结果远远超过搜索 python.org。 SO 投出最广泛的问题网,当它失败时,提出问题通常会得到快速响应和积分。在许多情况下,会链接到其他更好的资源,因此人们会被指向最佳答案来源。

标签: python


【解决方案1】:
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 是一个元组。

【讨论】:

    【解决方案2】:

    这已记录并解释了in the Python FAQ

    如需完整讨论,请阅读常见问题解答条目。但简而言之,问题在于这段代码:

    t[0] += [56, 78]
    

    …等价于:

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

    __iadd__成功就地修改list,并返回自己;然后赋值引发异常。

    它是not considered a bug,因为这是+=list.__iadd__tuple 全部工作的不可避免的结果。虽然对于不了解这三件事的人来说并不明显,但任何改变事情的尝试对于任何确实了解的人来说都不是显而易见的(并且可能会破坏很多其他的,更多重要,案例)。

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 2023-02-06
      • 2013-10-20
      • 2012-01-22
      • 2017-11-18
      • 1970-01-01
      • 2014-02-17
      • 2021-10-29
      • 2021-08-10
      相关资源
      最近更新 更多