我正在尝试:
>>> 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
值已更改。
答案 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()
而不是
+=