1. 程式人生 > 實用技巧 >[python]python的可變物件和不可變物件

[python]python的可變物件和不可變物件

說明

在python中處處皆物件,那麼具體細分又可以分為可變型別和不可變型別物件,今天來詳細討論一下。

is 和 == 的區別

先提前說一下is和==的區別以幫助理解。
is是判斷兩者是否屬於同一記憶體,即id(a) == id(b).而等於則是通過比較兩個值的大小是否相同。以下是例子:

a = 'hello world'
b = 'hello world'
a == b  #返回True 
a is b  #返回False

可變物件和不可變物件

由於python中萬物皆物件,而且對於呼叫不存在值呼叫這一說法,所有的呼叫的都是物件的引用,那麼根據其引用的物件是否能夠修改可以分為可變物件和不可變物件。
其中可變物件為:list, set, dict
不可變物件為:int,string,float,tuple

不可變物件

由於Python中的變數存放的是物件引用,所以對於不可變物件而言,儘管物件本身不可變,但變數的物件引用是可變的。所以當對不可變物件重新賦值的時候,會重新開闢一段記憶體空間,並將地址引用指向新開闢的空間,原有的記憶體空間將被回收。以下是一個例子:

print(id(100)) # 140726575113072
a = 100
print(id(a)) # 140726575113072
b = 100
print(id(b)) # 140726575113072
a += 2
print(id(a)) # 140726575113136
b = 102
print(id(b)) # 140726575113136

a和b為相同值時,其對應的記憶體空間是一致的;當a值發生變化時,不是在原有記憶體上進行修改,而是重新開闢了記憶體空間進行修改,然後指向新的地址。但是需要注意的是,由於小數快取機制,[-5,257]之間的整數使用的共用的快取的空間,當超過257時,即使相同的數值也會分配不同的地址空間。

可變物件

可變物件的引用指向了儲存空間的首地址,而且有關於list的meta資訊和object是分開的,因此在list中可以儲存不同的資料型別,當新增新元素時,會在meta中增加相應的地址,實際上list名稱是地址引用的引用,因此在改變list內容後,其指向的地址並不會發生改變。以下是一個例子:

l = [1,2,3,4]
l2 = [1,2,3,4]
print(l is l2) # id(l) == id(l2) false
id1 = id(l)
l.append(5)
id2 = id(l)
print(id1 == id2) # true

list在發生變化後其指向的記憶體空間並沒有發生改變。