Python 修改元组上的列表。我得到一个类型错误,但元组值已更改
我正在努力:Python 修改元组上的列表。我得到一个类型错误,但元组值已更改,python,list,tuples,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]
>>> 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=([],[])
>>>id(c)
43002440L
>>>c[0]。追加(1)
>>>c
([1], [])
>>>id(c)
43002440L
>>>c[0]+=[2]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“tuple”对象不支持项分配
>>>c
([1, 2], [])
>>>id(c)
43002440L
我使用了c[0]。append(1)
是正确的,当我尝试c[0]+=[2]
时,我得到了一个类型错误。但是我发现c
值已更改。请使用
.extend()
而不是
+=
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]
。此步骤失败,出现类型错误
,但列表已在步骤2中修改
>>> c[0] += [2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
之所以
c[0].extend([2])
有效,是因为c[0]
是对列表
实例的引用,而不是元组
的插槽。因此,修改它与使用任何列表引用/变量时一样。这并不能解释为什么要更改该值。即使这会产生类型错误,c[0]
仍会显示尝试的更改。这个答案并不能解释这一点。请注意并及时更新:)谢谢!你没抓住重点。在c[0]+=[2]
之后,c[0]
是[1,2]
。如果c[0]是([1],])
,您不能这样做吗?什么?你感到困惑还是我感到困惑?:)
c[0].extend([2])