python學習之—mutable
- 2020 年 1 月 3 日
- 筆記
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,我們在函數參數傳遞是指針傳遞