Python:list是元组中的元素时的列表操作

nev*_*sly 4 list python-2.7

我正在使用Python2.7.*,并在list是元组的元素时尝试列表操作的测试.
但是我找到了一些我无法理解的东西:

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

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

>>> c = ([], )
>>> c[0].extend([1,2,3])
>>> 
>>> c
([1, 2, 3],)
Run Code Online (Sandbox Code Playgroud)

我知道,元组是不可改变的,名单是可变的,我知道,list +=就相当于list.extend()列表+ =元组VS列表=列表+元组.
但现在我在海上,如何解释上面的代码.

小智 7

在此代码中,您将分配给第一个元素,这在元组中是不可能的.

>>> a = ([],)
>>> a[0] = a[0] + [1,2,3] 
Run Code Online (Sandbox Code Playgroud)

在这里,您在右侧创建一个新列表a[0]+[1,2,3],然后尝试将其分配回a[0]不合法的列表.

在此代码中,您将检索元组的第一个元素,然后对其进行操作.

>>> c = ([], )
>>> c[0].extend([1,2,3])
Run Code Online (Sandbox Code Playgroud)

当然,这是一个小的语义差异,但是在第一次尝试重新分配元组中的元素时.但让我们看一下幕后发生的事情:

在这里,我们分配一个列表x并观察它的id如何通过不同的操作发生变化.

>>> x=[]
>>> id(x)
139987361764560
>>> id([])
139987361677112
>>> id(x+[1])
139987361829736
>>> x.append(1)
>>> x
[1]
>>> id(x)
139987361764560
Run Code Online (Sandbox Code Playgroud)

注意,对于ID [],x并且x+[1]都不同,但对于ID x之后,我们追加一个1仍然是相同的.这再次强化了上面的声明,声明该声明a[0] = a[0] + [1,2,3]正在创建一个新列表,然后尝试将其分配给元组.

但是我们的元组是什么,让我们再次进行一些id检查:

>>> id(y)
139987361830168
>>> id(y[0])
139987361677112
>>> id(y[1])
139987361723384
>>> y[1] = y[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> y[1].append(1)
>>> id(y[1])
139987361723384
>>> y
([], [1])
Run Code Online (Sandbox Code Playgroud)

我们再次创建一个元组,可以看到元组y及其每个元素都有不同的ID.但请注意,我们甚至无法将相同的列表分配回元组中的相同位置.但是,我们可以按预期在该列表上执行操作,并看到元组更改.

关于不变性:这里需要注意的重要一点是元组不会改变,因为元组中对象的id不会改变.