Python的可變型別與不可變型別

2021-08-14 19:46:23 字數 2075 閱讀 4153

今天同事問了我乙個問題,關於python中的可變型別與不可變型別。之前我只知道python中有可變型別與不可變型別,至少我知道數字型是不可變型別的。今天就趁著這個機會把這個問題徹底搞清楚。

python的資料型別大致可以分成數字型,字元型,列表型,元組型和字典型。其中,數字型,字元型和元組型是不可變型別,其他兩種型別列表型和字典型是可變型別。下面就通過幾個例子來說明什麼是可變型別和不可變型別。

首先還是看最簡單的數字型,我們定義i = 10。

[python]view plain

copy

>>>i = 

10>>>id(i)  

31486528l

>>>i = i + 1

>>>id(i)  

31486504l

>>>j = 10

>>>id(j)  

31486528l

>>>  

從上面執行的結果可以看出,雖然i = i + 1,但是i的記憶體位址已經發生變化。事實上並沒有改變原來i的值,只是又另外建立了乙個i的位址。也就是說在31486528l這個記憶體位址所存放的資料的型別是不能改變的,而且其值也不能發生改變。當這個位址的值不再使用時,該記憶體位址被釋放掉。當i的值發生變化後,則i的記憶體位址也發生變化,即int是不可變型別。

如果另乙個變數的值也是10,則i,j的值相同,指向同一記憶體位址,這也是python比較有意思的地方。

下面我們看看浮點型是什麼情況。

[python]view plain

copy

>>>i = 

1.2>>>id(i)  

31547504l

>>>i = i + 1.3

>>>id(i)  

31547528l

>>>j = 1.2

>>>id(j)  

31547580l

>>>  

從上面可以看到,浮點型的資料和int型的資料情況差不多,只是兩個值相同的浮點型並沒有指向同一塊記憶體。這是因為python

只對整型和短字串進行了快取,對float型和長字串並沒有進行快取。

下面我們來看看可變型別,以list為例

[python]view plain

copy

>>>li = [1, 

2, 3]  

>>>id(li)  

40238855l

)  >>>li  

[1, 2, 

3, 4]  

>>>id(li)  

40238855l

li是乙個list型,初始值是[1, 2, 3]。此時li的記憶體位址是40238855l。但是當li的值發生變化,變成[1, 2, 3, 4]時,這個時候li

的記憶體位址還是40238855l。即記憶體位址40238855l所存放的值是可變的。

對於可變型別,還有乙個需要注意的。當使用賦值語句「=」把兩個可變型別「連線」在一起後,他們就指向了同一塊記憶體位址。

由於它是可變型別,則兩個變數會指向同乙個記憶體位址。當其中乙個變數發生變化後,另乙個變數也會發生變化。

[python]view plain

copy

>>>a_list = [1, 

2, 3]  

>>>b_list = [1, 2

, 3]  >>>id(a_list)  

40238856l

>>>id(b_list)  

40793096l

>>>b_list = a_list  

>>>id(b_list)  

40238856l

)  >>>b_list  

[1, 2, 

3, 4]  

a_list和b_list的值是相等的,但是由於list是可變型別,因此他們的記憶體位址並沒有指向同一塊記憶體位址。如果使用賦值語句

可以把兩個list變數的記憶體位址變成是一樣的,但是要注意當a_list的值發生變化後,b_list值也會跟著發生變化。

以上就是今天的部落格內容。

與您共勉!

python可變型別與不可變型別

學習版本3.5.2 python的基礎型別數值 字串和元組都是不可變型別,列表和字典時可變型別 1.number 字串 id 1 4297546560 id 2 4297546592 a 1 id a 4297546560 a 2 id a 4297546592 b 1 id b 429754656...

python可變型別與不可變型別

不可變資料型別在第一次宣告賦值的時候,會在記憶體中開闢一塊空間,用來存放這個變數被賦的值,而這個變數實際上儲存的,並不是被賦予的這個值,而是存放這個值所在空間的記憶體位址,通過這個位址,變數就可以在記憶體中取出資料了.所謂不可變就是說,我們不能改變這個資料在記憶體中的值,所以當我們改變這個變數的賦值...

Python 可變型別與不可變型別

可變型別 值改變,id不變,證明改的是原值,證明原值是可以被改變的 不可變型別 值改變,id也變了,證明是產生新的值,壓根沒有改變原值,證明原值是不可以被修改的 x 10print id x x 11 print id x 將x的值修改後,原值 10 無法被改變,在記憶體中建立新的位址儲存 11 並...