【问题标题】:python tuple, can someone explain this behavior? [duplicate]python元组,有人可以解释这种行为吗? [复制]
【发布时间】:2013-12-14 14:40:00
【问题描述】:

我在 SO 上发现了一些关于 TypeError: 'tuple' object does not support item assignment 的问题,但我仍然对此感到困惑:

考虑一下代码sn-p:

>>> a = ([],[])
>>> a[0].append(1)       # 1
>>> a
([1], [])
>>> a[0] += [2]

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a[0] += [2]
TypeError: 'tuple' object does not support item assignment   # 2
>>> a
([1, 2], [])   # 3
>>> 

我的问题是:

  1. 元组是不可变的,但是1成功改变了它的值。为什么?(我知道我不太了解python的不可变性..)
  2. 如果1被接受,那么2提升TypeError的原因是什么?
  3. 3 中,a 被修改了,那么提出TypeError 有什么意义?

谢谢

【问题讨论】:

  • 首先,见docs.python.org/3/reference/…——基本上,“元组是不可变的”仅表示“你不能在元组中添加、删除或替换对象”,而不是“元组中包含的对象是不可变的”也”。

标签: python tuples


【解决方案1】:

这是因为元组是不可变的,但它可以包含可变数据类型(在您的情况下为 list)作为元素。

您的元组a = ([], []) 是一个列表元组。这就是为什么您能够将数据附加到 a[0] - 这是一个列表。

在这个:

a[0] += 2 

您试图更改引发异常 TypeError 的元组的值(由于使用了 '=' 赋值运算符)

在三个中,由于使用了“+”运算符,列表被连接起来。

【讨论】:

  • -1 您的回答没有解决a[0] += 2 如何尝试修改元组,因为天真地,我希望只修改列表对象。 a[0]a 不同。
  • a[0] = a[0] + [2],这里右侧完成没有错误(发生连接),当试图将结果分配给 a[0] 你实际上是给元组赋值,所以它会抛出一个错误。我可能错了。但这就是我的理解。
猜你喜欢
  • 2019-12-06
  • 2019-06-02
  • 2016-09-18
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多