python學習之—mutable

python的數據類型分為mutable(可變) 和 immutable (不可變)

mutable : list ,dict

inmutable : int , string , float ,tuple…

mutable和immutable 字面意思理解就是說數據可變和數據不可變

由於python的變數(variable)不需要聲明,而在賦值的時候,變數可以重新賦值為任意值,這就涉及到Python的一個重要的核心概念:動態類型(dynamic typing)

在這裡重複強調一下在python中一切皆對象,python是純血統的面向對象的程式語言,與java不同。我們知道java中有裝箱和拆箱,基本數據類型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=2  func(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,我們在函數參數傳遞是指針傳遞