資料型別分為可變、不可變。可變物件表示可以原處修改該資料物件,不可變物件表示必須建立新物件來儲存修改後的資料。
在基礎資料型別中:
對於可變物件,比如有乙個列表l,檢視它的id以及第乙個元素的id。
>>> l = ['a', 'b', 'c']
>>> id(l)
23099392
>>> id(l[0])
57027008
這意味著在記憶體中有一片區域,這片區域存放的資料型別是列表(每個資料物件都有自己的型別宣告),列表包含至少3個資料記憶體塊,分別存放了3個字串型別的資料(實際上是存放了這3個字元物件的位址)。如下圖所示:
可變物件(不僅僅是這裡的序列、列表)意味著修改該資料物件,不會在記憶體中新建立另乙個記憶體空間來存放新資料物件。例如,修改這個列表中的第乙個元素為"aa"。
>>> l[0]="aa"
>>> l
['aa', 'b', 'c']
>>> id(l)
23099392
發現列表的id並沒有改變,也就是列表的記憶體位址仍然是那一塊。這表示列表是可變序列。
但是,如果檢視第乙個元素的id,會發現已經改變了:
也就是說,修改列表中的第乙個元素過程中,建立了乙個新的記憶體塊來存放新的字串,原始的那個字串"a"因為沒有被引用了,它將等待垃圾**器的**。不管如何,列表的位址一直沒變。
為什麼修改列表中的元素需要建立新的記憶體塊?這是因為這個元素是字串,而字串是不可變物件。
不可變物件意味著,不能在原始記憶體位址塊中修改資料,必須新建立乙個位址塊來儲存修改後的資料物件。正如上面修改字串"a"為"aa"的結果。
假如列表l中的第乙個元素仍然是乙個巢狀在l中的列表,因為列表是可變物件,現在修改l的第乙個元素,這第乙個元素的位址不會改變。
>>> l = [['a'], 'b', 'c']
>>> id(l[0])
23099392
>>> l[0][0] = "aa"
>>> id(l[0])
23099392
這裡改變的只有內嵌的列表中第乙個元素的位址。
雖然可變物件可以原處修改資料,不會建立新物件,但並不意味著操作可變物件總是不會建立新物件,這取決於對可變物件做什麼操作,比如分片操作一定會建立新物件。
python 可變物件和不可變物件
變數沒有型別,那麼就意味著它可以隨意指向任何物件。python中的變數相當於乙個指標。當將乙個變數a賦值給另乙個變數b時,無論變數a指向的是可變物件還是不可變物件,變數b指向變數a指向的物件。例 alist 1 2,3 anolist alist id alist id anolist true b...
Python可變物件和不可變物件
python中一切皆物件,每個物件都有其唯一的id,對應的型別和值,其中id指的是物件在記憶體中的位置。根據物件的值是否可修改分為可變物件和不可變物件。其中,不可物件包括 數字,字串,tuple,frozenset 不可變集合 可變物件包括 list,dict,set python中的變數可以指向任...
Python 可變物件和不可變物件
python在heap中分配的物件分成兩類 可變物件和不可變物件。所謂可變物件是指,物件的內容是可變的,例如list。而不可變的物件則相反,表示其內容不可變。一 不可變物件 由於python中的變數存放的是物件引用,所以對於不可變物件而言,儘管物件本身不可變,但變數的物件引用是可變的。從上面得知,不...