繁体   English   中英

无法理解python中的可变对象

[英]Can't understand mutable objects in python

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

创建列表时:

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

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

仅在左侧具有名称的运算符=始终为该名称分配一个对象。 它没有做任何其他事情。

名称=带有索引(括号中的内容)的操作=调用命名对象上的__setitem__

您正在调用第一个行为。 您正在创建一个新列表,丢弃旧列表,并将新列表分配给名称list

要对对象进行突变而不是替换,您将需要调用第二种行为:

lst[:] = [4, 5, 6]

这会将新值分配给原始列表的元素 现在,原始列表的内容将更改,但是与您期望的一样,它将是具有相同ID的相同对象。

在这两种情况下,只要将方括号括起来的逗号分隔列表都将创建一个新的列表对象。 [1, 2, 3]创建一个列表, [4, 5, 6] 区别在于您对第二个列表的处理方式。 lst = [4, 5, 6]将其分配给名称lst ,丢弃该名称可能已绑定到的所有先前对象。 lst[:] = [4, 5, 6]实际上大致等同于执行lst.__setitem__(slice (None), [4, 5, 6]) 这会将第二个列表的元素复制到第一个列表中,但不会更改任何名称绑定。

并且不要调用变量list 它隐藏了内置函数。 从根本上没有什么可以阻止您执行此操作,只是将新对象重新绑定到现有名称(如您的原始示例)。 但是随后您将要使用list函数,并在Stack Overflow上加入成群结队,总是问为什么内置函数不起作用。

在第二行中,您只是在创建一个新的列表对象并将其分配给列表。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM