今天同事問了我乙個問題,關於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 並...