修改元组上的列表。我得到一个类型错误,但更改了元组值

时间:2013-12-14 12:52:19

标签: python list tuples

我正在尝试:

>>> a = []
>>> id(a)
42952968L
>>> a.append(1)
>>> a
[1]
>>>id(a)
42952968L
>>> a += [2]
>>> a
[1, 2]
>>> id(a)
42952968L
>>> a = a +[3]
>>> a
[1, 2, 3]
>>> id(a)
43001480L

我知道我们使用a.append(1)a += [2]id(a)没有变化。当使用a = a +[3]时,id(a)已更改。

现在,我这样使用:

>>> c = ([], [])
>>> id(c)
43002440L
>>> c[0].append(1)
>>> c
([1], [])
>>> id(c)
43002440L
>>> c[0] += [2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> c
([1, 2], [])
>>> id(c)
43002440L

我使用c[0].append(1)是正确的,当我尝试c[0] += [2]时,我遇到了类型错误。但我发现c值已更改。

3 个答案:

答案 0 :(得分:2)

c[0] += [2]分多步执行,大致等同于以下内容:

import operator
x = c[0]
x = operator.iadd(x, [2])
c[0] = x

首先,Python得到c[0]。那部分工作正常。

第二部分可能看起来有点奇怪。 Python要求c[0]获取的对象在其中就地添加[2]。列表[1]有义务,成为[1, 2]。不同的数据类型可能无法就地实现此操作,返回新对象。列表修改自己并返回自己。

然后,Python尝试将[1, 2]分配给c[0]。此步骤失败,给出TypeError,但该列表已在步骤2中修改过。

答案 1 :(得分:1)

>>> c[0] += [2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Python中的

tuple(s)是不可变对象。因此,您无法修改它们。

在这种情况下,

c[0]是对该元组的第一个项目/广告位的引用,当您尝试为<{1}} 分配时,上述{{ 1}}。

考虑使用:

+=

TypeError的作用原因是c[0].extend([2]) c[0].extend([2])实例的引用,而不是c[0]的插槽。因此,修改它与使用任何list引用/变量时相同。

答案 2 :(得分:0)

请使用

.extend()

而不是

+=