修改元组上的列表。出现类型错误,但元组值已更改

2024-04-19 20:50:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在努力:

>>> 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值已更改。你知道吗


Tags: inidmostobjectstdinlinecallfile
3条回答

请使用

.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]。这个步骤失败,给出了一个TypeError,但是列表已经在步骤2中被修改了。你知道吗

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

Python中的tuple是不可变的对象。因此不能修改它们。你知道吗

c[0]在本例中是对该元组的第一个项/槽的引用,当您尝试用+=将赋值给它时,该引用会用上述TypeError失败。你知道吗

考虑使用:

c[0].extend([2])

c[0].extend([2])工作的原因是c[0]是对list实例的引用,而不是tuple的插槽。因此,修改它与修改任何list引用/变量一样。你知道吗

相关问题 更多 >