[英]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
。 這使得元組不可變,列表可變。
分配給la
或ta
不會改變任何對象,這些只是對象的名稱(別名):
ta=[1,2,3]
ta=4
第二個賦值沒有改變列表,它改變了名稱ta
來引用整數4
。 列表[1,2,3]
,如果沒有其他引用它,將被垃圾收集和銷毀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.