之前和之后的对象ID应该相同,但不会发生。有人可以向我解释为什么要制造新物体。
L = [1, 2, 3]
print(id(L))
L = L + [4]
print(id(L))
正在打印的两个ID都不相同,它的可变对象是否相同。但是当我使用列表的append方法添加4时,id是相同的
答案 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”。