Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 修改元组上的列表。我得到一个类型错误,但元组值已更改_Python_List_Tuples - Fatal编程技术网

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])