所以我认为列表是python中的MUTABLE对象,因此可以对其进行更改。
创建列表时:
list = [1, 2, 3]
print(id(list))
list = [4, 5, 6]
print(id(list))
在两种情况下,我应该获得相同的ID。但是我得到了不同的ID。为什么会这样?
答案 0 :(得分:2)
在左侧仅带有名称的运算符=
始终为该名称分配一个对象。它什么也没做。
名称为=
的操作__setitem__
在命名对象上调用list
。
您正在调用第一个行为。您正在创建一个新列表,丢弃旧列表,并将新列表分配给名称lst[:] = [4, 5, 6]
。
要更改对象而不是替换对象,您将需要调用第二个行为:
[1, 2, 3]
这会将新值分配给原始列表的元素。现在,原始列表的内容将发生变化,但与您期望的一样,它将是具有相同ID的相同对象。
在两种情况下,每当您将用逗号分隔的列表放在方括号中时,都会创建一个新的列表对象。 [4, 5, 6]
创建一个列表,lst = [4, 5, 6]
也创建一个列表。区别在于您对第二个列表的处理方式。 lst
将其分配给名称lst[:] = [4, 5, 6]
,丢弃该名称可能已绑定到的所有先前对象。 lst.__setitem__(slice (None), [4, 5, 6])
实际上大致等同于进行list
。这会将第二个列表的元素复制到第一个列表中,但不会更改任何名称绑定。
不要调用变量list
。它隐藏了内置函数。从根本上没有什么可以阻止您执行此操作,只是将新对象重新绑定到现有名称(如您的原始示例)。但是然后,您将需要使用adb uninstall com.appname
函数,并在Stack Overflow上加入成群结队,总是询问为什么它们的内置项不起作用。
答案 1 :(得分:0)
在第二行中,您只是在创建一个新的列表对象并将其分配给列表。
list=[4,5,6] //creates a new list object and puts its reference in list
要显示列表是可变的,您可以尝试在此行应用操作:
list=[1,2,3]
赞:
>>> a = [1,2,3]
>>> id(a)
2814816838216
>>> a[0] = 4
>>> a
[4, 2, 3]
>>> id(a)
2814816838216