无法理解python中的可变对象

时间:2018-09-22 05:09:25

标签: python

所以我认为列表是python中的MUTABLE对象,因此可以对其进行更改。

创建列表时:

list = [1, 2, 3]
print(id(list))
list = [4, 5, 6]
print(id(list))

在两种情况下,我应该获得相同的ID。但是我得到了不同的ID。为什么会这样?

2 个答案:

答案 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