Python中的可变和不可变对象

2024-05-21 08:33:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解python中的可变/不可变对象。在下面的示例中,我希望为所有id(**)获得相同的对象id,但清单4不是。我如何解释只有#列表4给出不同对象id的原因? 多谢各位

# list 1
la = [1,2,3]
print('la=', la, ', id(la)= ',id(la))

# list 2
la[0]=9
print('la=', la, ', id(la)= ',id(la))

# list 3
lb=la
print('lb=', lb, ', id(lb)= ',id(lb))

# list 4
lc=la[:]
print('lc=', lc, ', id(lc)= ',id(lc))
la= [1, 2, 3] , id(la)=  2678849549576
la= [9, 2, 3] , id(la)=  2678849549576
lb= [9, 2, 3] , id(lb)=  2678849549576
lc= [9, 2, 3] , id(lc)=  2678844118664

Tags: 对象id示例列表原因lalistlc
2条回答

[:]语法是^{}的快捷方式,它从原始对象创建一个新的(浅拷贝)对象。浅层副本是新的高级对象,因此嵌套对象将仅被引用(不会创建嵌套对象的新副本)。例如

a = [1,2,3]
b = a
id(a) == id(b) # True
c = a[:]
id(a) == id(c) # False
id(a[0]) == id(c[0]) # True

可以这样想:一个切片需要是一个不同的对象,一个原始对象的副本:

In [15]: la=[1,2,3]                                                                                                   

In [16]: la[:2]                                                                                                       
Out[16]: [1, 2]

In [17]: la=[1,2,3]                                                                                                   

In [18]: lb=la[:2]                                                                                                    

In [19]: lb[0] = 5                                                                                                    

In [20]: lb                                                                                                           
Out[20]: [5, 2]

In [21]: la                                                                                                           
Out[21]: [1, 2, 3]

la[:]是一个切片,尽管在这种形式中,它是一个返回整个列表的切片

但是,切片与元组的工作方式相同,元组是不可变的类型:

In [22]: ta=(1,2,3)                                                                                                   

In [23]: ta[:2]                                                                                                       
Out[23]: (1, 2)

等等

与列表不同的是,您不能执行ta[0] = 5。这使得元组是不可变的,列表是可变的

分配给lata不会改变任何对象,这些只是对象的名称(别名):

ta=[1,2,3]
ta=4

第二个赋值没有更改列表,它更改了名称ta以引用整数4。列表[1,2,3],如果没有其他引用,将被垃圾收集并销毁

相关问题 更多 >