標籤:python
python的資料類型分為mutable(可變) 和 immutable (不可變)
mutable : list ,dict
inmutable : int , string , float ,tuple...
mutable和immutable 字面意思理解就是說資料可變和資料不可變
由於python的變數(variable)不需要聲明,而在賦值的時候,變數可以重新賦值為任意值,這就涉及到Python的一個重要的核心概念:動態類型(dynamic typing)
在這裡重複強調一下在python中一切皆對象,python是純血統的物件導向的程式設計語言,與java不同。我們知道java中有裝箱和拆箱,基礎資料型別 (Elementary Data Type)int在持久化的過程中是需要封裝為Integer的。
但是在python中,一切皆對象。什麼都是對象,包括你的代碼,對象是儲存在記憶體中的實體,我們在程式中使用的都是對象名,只是指向這個對象的一個引用(reference)。
引用和對象分離,是動態類型的核心,引用可以隨時的指向一個新的對象
這不同於c++中的指標和引用的概念,在C++中指標在邏輯上是獨立存在的,但是引用是和對象綁定在一起的。
例如:
a = ‘viease‘
a = 2
第一個語句是在記憶體中建立了對象‘viease’(字串類型),通過賦值讓引用a指向它
第二句是,2是在記憶體中存在的整數對象,將引用a指向2,於是‘viease’就沒有引用指向它,python會自動的將這種沒有引用指向的垃圾銷毀掉,釋放相應的記憶體空間
(而對於較小的整數和短字元python會緩衝這些對象,而不是頻繁的建立和銷毀)
immutable(不可變資料類型)
例如
def func(x): x=1 print(x)x=2func(x)print(x)
輸出結果為
1
2
這樣類似於c/c++中的值傳遞,即傳遞的引用不能改變自身,只是改變了引用的指向
##############################################################
def func(x): x[0]=4 print(x)x=[1]func(x)print(x)
輸出結果為
[4]
[4]
這就類似於c/c++中的指標傳遞,即傳遞的引用可以引用自身的元素改變自身,改變了引用的值
但是元組(tuple),儘管可以調用引用元素,但不可以賦值,因此不能改變對象自身,所以也算是immutable object.
那麼總結一下:
對於inmutable object 我們在函數參數傳遞是值傳遞
對於mutable object,我們在函數參數傳遞是指標傳遞
python學習--mutable and immutable