ID应该相似,但是有人可以解释我为什么

时间:2019-01-13 18:20:00

标签: python

之前和之后的对象ID应该相同,但不会发生。有人可以向我解释为什么要制造新物体。

L = [1, 2, 3]    
print(id(L))
L = L + [4]
print(id(L))

正在打印的两个ID都不相同,它的可变对象是否相同。但是当我使用列表的append方法添加4时,id是相同的

2 个答案:

答案 0 :(得分:1)

虽然列表是可变的,但这并不意味着涉及它们的所有操作都会使列表变位。在您的示例中,您正在L + [4]串联两个列表。调用list.__add__方法以实现创建新列表的方式,而不是修改L。您要将旧名称L绑定到新列表,因此从id(L)获得的值会更改。

如果您想在将值添加到末尾时对L进行突变,则可以采用多种方法。如果您仅要添加一个项目,L.append(4)是不二之选。如果第二个列表中的项目多于一个,则L.extend([4])或几乎同义的L += [4]可以工作。

请注意,有时要创建一个新列表就可以了!如果要保留对旧列表的未修改引用,则可能需要在添加新值的同时创建一个包含大部分内容的新列表。虽然您可以复制列表然后使用上面提到的一种就地方法,但也可以只使用+来同时复制值并将其添加到列表(只需将结果绑定到新名称) :

L = [1, 2, 3]
M = L + [4]  # this is more convenient than M = list(L); M.append(4)
print(L) # unchanged, still [1, 2, 3]
print(M) # new list [1, 2, 3, 4]

答案 1 :(得分:0)

  

具有可变对象

是,您可以更改值而无需创建新对象。但是使用+,您正在创建一个新对象。 要使可变值静音,请使用方法(例如append)或设置项目(a[0] = ...)。一旦有了L=,先前由L引用的对象就会丢失(如果它没有任何其他引用),并且L将获得一个新值。

这是有道理的,因为,实际上,对于L = L+[0],您说的是“计算L+[0]的值并将其分配给L”,而不是“将[0]添加到L”。