python基礎 可變型別與不可變型別

2021-08-25 11:18:47 字數 2219 閱讀 4631

以下是對python 引用和物件理解的延伸

從上面的文章可以總結出python中變數名和物件是分離的,通過「=」給變數賦值時,實際上引用變數指向乙個物件,而這個物件則是對應記憶體中儲存的一塊資料,取消引用時,python會**記憶體。

in [1]: a=100
這個語句執行的意思是:設定記憶體中一塊區域儲存物件「100」,引用變數a指向這個物件。

可以查詢該物件的記憶體位址

in [3]: id(a)

out[3]: 9095328

再執行語句b=a,又是如何實現呢?

in [2]: b=a

in [6]: id(b)

out[6]: 9095328

b=a 執行結果是,變數b指向a所指向的物件,這個與c語音中複製記憶體值的機制不一樣。

再思考下一旦賦值後,能不能改變呢?

in [7]: a=100

in [8]: id(a)

out[8]: 9095328

in [9]: a=200

in [33]: id(a)

out[33]: 139731596731920

答案是no,從上圖可知重新賦值後,實際是指向了另外乙個物件,id結果並不一樣。

這種資料型別就是不可變型別

我們再來看看b的引用物件有沒有發生變化?

in [34]: id(b)

out[34]: 9095328

可以看出b還是指向以前的物件。這個地方與可變型別不一樣。

再來看看可變的,例如:

in [35]: m=[10,20,"abc"]

in [36]: id(m)

out[36]: 139731610235208

in [38]: id(m)

out[38]: 139731610235208

in [39]: m.pop()

out[39]: 30

in [40]: m

out[40]: [10, 20, 'abc']

in [41]: id(m)

out[41]: 139731610235208

可以看出變數m資料修改時,指向的物件一直沒有發生變化。

同樣的 n=m,m發生變化時,n會變化嗎?

in [40]: m

out[40]: [10, 20, 'abc']

in [41]: id(m)

out[41]: 139731610235208

in [42]: n=m

in [45]: id(n)

out[45]: 139731610235208

in [46]: m.insert(1,50)

in [47]: m

out[47]: [10, 50, 20, 'abc']

in [48]: id(m)

out[48]: 139731610235208

in [49]: id(n)

out[49]: 139731610235208

in [50]: n

out[50]: [10, 50, 20, 'abc']

n的值會隨著m一起發生變化,且指向同一物件。

因此不可變型別就是指向的物件內容不允許發生改變,只能改變引用指向。

包括:字串、數字、元組

可變型別就是指向的物件內容允許發生改變,可以改變物件內容而引用不變。

包括:列表、字典

注意

1、字典中的key值只能是不可變內容

2、對於不可變型別的全域性變數來說,因其指向的物件不能修改,所以不使用global時無法修改全域性變數。

3、對於可變型別的全域性變數來說,因其指向的物件可以修改,所以不使用global時也可修改全域性變數。

4、python中函式引數是引用傳遞(注意不是值傳遞)。對於不可變型別,因變數不能修改,所以運算不會影響到變數自身;而對於可變型別來說,函式體中的運算有可能會更改傳入的引數變數。

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 並...