python的可變與不可變資料型別

2022-10-11 02:30:11 字數 2459 閱讀 1595

首先,我們需要知道在python中哪些是可變資料型別,哪些是不可變資料型別。可變資料型別:列表list和字典dict;不可變資料型別:整型int、浮點型float、字串型string和元組tuple。

初學python的時候,可能會有很多疑惑,尤其是最先接觸的所謂的「可變資料型別」和「不可變資料型別」。python與c/c++不一樣,它的變數使用有自己的特點,當初學python的時候,一定要記住「一切皆為物件,一切皆為物件的引用」這句話,其實這個特點類似於j**a,所以在python裡面大家也不用擔心類似於c/c++中的指標的複雜問題。下面本文將對python裡面的「可變資料型別」和「不可變資料型別」進行分析。

首先,我們需要知道在python中哪些是可變資料型別,哪些是不可變資料型別。可變資料型別:列表list和字典dict;不可變資料型別:整型int、浮點型float、字串型string和元組tuple。

然後,我們以int和list為例,來看看「可變資料型別」和「不可變資料型別」到底有什麼區別。

(1)不可變資料型別分析。先來看一段程式:

[python]view plain

copy

>>> x = 1  

>>> id(x)  

31106520  

>>> y = 1  

>>> id(y)  

31106520  

>>> x = 2  

>>> id(x)  

31106508  

>>> y = 2  

>>> id(y)  

31106508  

>>> z = y  

>>> id(z)  

31106508  

[python]view plain

copy

>>> x += 2  

>>> id(x)  

31106484   

上面這段程式都是對不可變資料型別中的int型別的操作,id()檢視的是當前變數的位址值。我們先來看x = 1和y = 1兩個操作的結果,從上面的輸出可以看到x和y在此時的位址值是一樣的,也就是說x和y其實是引用了同乙個物件,即1,也就是說記憶體中對於1只占用了乙個位址,而不管有多少個引用指向了它,都只有乙個位址值,只是有乙個引用計數會記錄指向這個位址的引用到底有幾個而已。當我們進行x = 2賦值時,發現x的位址值變了,雖然還是x這個引用,但是其位址值卻變化了,後面的y = 2以及z = y,使得x、y和z都引用了同乙個物件,即2,所以位址值都是一樣的。當x和y都被賦值2後,1這個物件已經沒有引用指向它了,所以1這個物件占用的記憶體,即31106520位址要被「垃圾**」,即1這個物件在記憶體中已經不存在了。最後,x進行了加2的操作,所以建立了新的物件4,x引用了這個新的物件,而不再引用2這個物件。

那麼為什麼稱之為不可變資料型別呢?這裡的不可變大家可以理解為x引用的位址處的值是不能被改變的,也就是31106520位址處的值在沒被垃圾**之前一直都是1,不能改變,如果要把x賦值為2,那麼只能將x引用的位址從31106520變為31106508,相當於x = 2這個賦值又建立了乙個物件,即2這個物件,然後x、y、z都引用了這個物件,所以int這個資料型別是不可變的,如果想對int型別的變數再次賦值,在記憶體中相當於又建立了乙個新的物件,而不再是之前的物件。從下圖中就可以看到上面程式的過程。

圖1 python不可變資料型別分析

從上面的過程可以看出,不可變資料型別的優點就是記憶體中不管有多少個引用,相同的物件只占用了一塊記憶體,但是它的缺點就是當需要對變數進行運算從而改變變數引用的物件的值時,由於是不可變的資料型別,所以必須建立新的物件,這樣就會使得一次次的改變建立了乙個個新的物件,不過不再使用的記憶體會被垃圾**器**。

(2)可變資料型別分析。下面同樣先看一段程式。

圖2 python可變資料型別分析

最後,大家主要區分開什麼是變數值的變化、什麼是變數引用的物件位址的變化這些概念就很清楚了,千說萬說都不如自己動手寫一些程式測試一下看看來得實在,所以建議大家有什麼疑惑可以自己寫一些基本的程式測試一下便知道結果。如果大家有新的意見,歡迎補充,謝謝。

Python 可變與不可變資料型別

可變資料型別有 list和dict 不可變資料型別有 int,float,string和tupe 對於不可變資料型別 不允許值發生變化,如果改變了變數的值,必然會建立新的物件 小整數和string型別不適用 對於值相同的變數指向的記憶體位址是同乙個 對於string型別和256範圍內的int型別是這...

Python的可變與不可變資料型別

根據可變資料型別與不可變資料型別的概念,只需要在改變值的同時,使用id 函式檢視變數id值是否變化就可以知道這種資料型別是可變的還是不可變的了。在python中資料型別有 數字 整形,浮點型 字串,列表,字典,布林值,集合,元組。接下來我們用例子來一一檢視他們分別屬於不可變資料型別還是可變資料型別 ...

Python的可變與不可變資料型別

首先,我們需要知道在python中哪些是可變資料型別,哪些是不可變資料型別。可變資料型別 列表list,字典dict和集合 不可變資料型別 整型int 浮點型float 字串型string和元組tuple 這個有疑問 在講is和 這兩種運算子區別之前,首先要知道python中物件包含的三個基本要素,...