可變與不可變類型
1、可變與不可變類型
1)學python,一定要記住“一切皆為對象,一切皆為對象的引用”;
2)所謂可變對象是指,對象的內容可變,而不可變對象是指對象內容不可變;
3)可變數據類型:value值改變,id值不變;不可變數據類型:value值改變,id值也隨之改變。
註:即id不變時,value可以改變則為可變數據類型,value不可以改變則為不可變數據類型。
4)不可變(immutable):int、字符串(string)、float、(數值型number)、元組(tuple)
i = 3 (被垃圾回收)
i = 3 + 1 (實際 i = 4
從而可知,不可變對象的特征沒有變,變的只是創建了新對象,改變了變量的對象引用。
如圖所示,因為整數為不可變,x,y,z在內存中均指向一個值為1的內存地址,也就是說,x,y,z均指向的是同一個地址。
優點:可以減少重復的值對內存空間的占用。
缺點:如上圖所示,修改這個變量綁定的值,如果內存中沒用存在該值的內存塊,那麽必須重新開辟一塊內存,把新地址與變量名綁定。而不是修改變量原來指向的內存塊的值,這會給執行效率帶來一定的降低。
5)可變(mutable):字典型(dictionary)、列表型(list)
2、如何確定一種數據類型是可變的還是不可變的:
根據可變數據類型與不可變數據類型的概念,只需要在改變value值的同時,使用id()函數查看變量id值是否變化,就可以知道這種數據類型是可變的還是不可變的了。
1)數字
數字:從圖中可以看出當數字的值改變時,變量id值也改變了,所以數字是不可變數;
python中為了減少開辟內存造成的時間開銷,對於三位內的整型數字類型數據,在開辟一塊內存空間後,後面的三位內的整型數據都放到這個內存空間中,所以三位以內的整型數字類型的id值都是相同的。
2)字符串
從圖中可以看出當字符串的值改變時,變量id值也改變了,所以字符串是不可變數據類型;
3)布爾
從圖中可以看出當布爾的值改變時,變量id值也改變了,所以布爾值是不可變數據類型
3)元祖
因為元祖元素是不可修改的,所以元祖是不可變數據類型
4)列表
從圖中可以看出,當列表中的某個元素改變時,列表的id值沒有改變,所以列表是可變數據類型;
5)字典
從圖中可以看出,當字典的鍵值對的value部分改變時,字典的id值沒有改變,所以字典是可變數據類型
轉載自:https://www.cnblogs.com/xxtalhr/p/9049188.html
我的博客園:https://www.cnblogs.com/yyl102
我的CSDN:https://blog.csdn.net/weixin_43992198
可變與不可變類型