簡體   English   中英

Python 中的可變和不可變對象

[英]Mutable and immutable object in Python

我試圖理解 python 中的可變/不可變對象。 在下面的示例中,我希望為所有 id(**) 獲得相同的對象 ID,但 # list 4 不是。 我如何解釋只有 #list 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

[:]語法是copy的快捷方式,它從原始對象創建一個新的(淺拷貝)對象。 淺拷貝是一個新的高級對象,因此只會引用嵌套對象(不會創建嵌套對象的新副本)。 例子,

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] ,如果沒有其他引用它,將被垃圾收集和銷毀。


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM