以下是對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 並...