python中的變數分為可變型別和不可變型別 兩種。
可變型別: 數字、字串、元組、可變集合。
不可變型別: 列表、字典、不可變集合。
這裡的可變不可變,是指記憶體中的那塊內容(value)是否可以被改變
所謂可變型別與不可變型別是指:資料能夠直接進行修改,如果能直接修改那麼就是可變,否則是不可變。
根據儲存的內容是否可變劃分為可變型別與不可變型別。如果是不可變型別,在對物件本身操作的時候,必須在記憶體中新申請
一塊區域(因為老區域是不可變)。如果是可變型別,對物件操作的時候,不需要再在其他地方申請記憶體,只需要在此物件後面連
續申請(+/-)即可,也就是它的address空間位址會保持不變,但區域會變長或者變短。
通過id(變數名) 來檢視變數的空間位址是否發生變化。
python中所宣告的變數都以物件的形式存在,存在於機器的固定記憶體之中。可以理解為變數名為物件的指標。
在python中設定的垃圾**機制採用的是引用計數機制來實現,就是通過使用計數器的方式來判斷空間的引用情況,當計
數器為0時則會將記憶體**。例如宣告變數a=3,則說明a指向儲存3的空間,那麼此時儲存3的空間引用計數加1。如果此時
定義a=4,那麼變數a的指向則指向記憶體中儲存4的空間位址,儲存4的空間引用計數加1,而之前儲存3的空間引用減1為0,
則會被作為垃圾**掉。
不可變型別
不可變型別有什麼好處?如果資料是不可變型別,當我們把資料傳給乙個不了解的api時,可以確保我們的資料不會被修改。如果我們要操作乙個從函式返回的元組,可以通過內建函式list()把它轉換成乙個列表。
python在宣告不可變型別時會在已經宣告的物件中尋找該物件是否已經被宣告過,若該物件被宣告過則,變數會直接指向該物件不會再申請新的記憶體空間。
如a=3已經宣告這時宣告b=3,則a,b指向同一塊記憶體
不可變型別不能對其內容直接修改,如字串'hellopython'可以對其進行分割加長的處理(經過如此處理之後python其實是將新的字串儲存到新的記憶體中),但是不能替換改變其字串中某個字母的內容。
(一) 數字、字串
如果a=2,那麼變數a的指向則發生了變化,指向了儲存2的空間位址。
舉例:這裡是最好區分可變與不可變型別的資料了。 如 現在是不可變型別 數字a=1,在修改a+1後得到的b,此時就會建立乙個新的記憶體位址用來儲存修改後的物件,所以記憶體位址不一樣。而對於可變型別資料在這一點就不一樣。
不可變型別:字串
不可變型別: 元組
可變型別
可變型別:列表
可變型別:字典
可變型別與不可變型別
一 什麼可變資料型別和不可變資料型別 可變資料型別 value值改變,id值不變 不可變資料型別 value值改變,id值也隨之改變。二 如何確定一種資料型別是可變的還是不可變的 根據可變資料型別與不可變資料型別的概念,只需要在改變value值的同時,使用id 函式檢視變數id值是否變化就可以知道這...
可變型別與不可變型別
可變型別 值發生改變時,記憶體位址不變,證明在改變原值 不可變型別 值發生改變時,記憶體位址也發生改變,即id也變,證明是沒有在改變原值,是產生新的值 1.數字型別 x 10 id x 1830448896 x 20 id x 1830448928 記憶體位址改變了,說明整型是不可變資料型別,浮點型...
2 1 7可變型別與不可變型別
python有兩種內建的或是已經定義過的型別。不可變型別不提供變更內容的方法。比如,變數x被置為6,它沒有增長的方法。如果你需要加1,你需要建立乙個新的物件。my list 1,2,3 my list 0 4print my list 4,2,3 the same list as changedx ...