Python 動態型別

2022-07-13 23:09:22 字數 2230 閱讀 5921

動態型別(dynamic typing)是python另乙個重要的核心概念。我們之前說過,python的變數(variable)不需要宣告,而在賦值時,變數可以重新賦值為任意值。這些都與動態型別的概念相關。

1. 動態型別

在我們接觸的物件中,有一類特殊的物件,是用於儲存資料的。常見的該類物件包括各種數字,字串,表,詞典。在c語言中,我們稱這樣一些資料結構為變數。而在python中,這些是物件。

物件是儲存在記憶體中的實體。而我們的變數,實際上只是指向這一物件的參考(reference),類似於c語言的指標。

(在c語言中,變數自身就是儲存於記憶體中的實體)

變數和它所指的物件的分離,就是動態型別的核心。由於變數只類似於乙個指標,所以它可以隨時指向乙個新的物件,即使這個新的物件的型別發生了變化。

a = 3a = '

at'

第乙個語句中,3是儲存在記憶體中的乙個整數物件。通過賦值,我們將在記憶體中建立這一物件,並將變數a指向改物件。

第二個語句中,我們在記憶體中建立物件『at』, 其型別是字串(string)。變數a在此又指向了'at'。而此時,物件3不再有變數指向它,python會自動將沒有變數指向的物件銷毀(destruct),從而釋放相應記憶體。

(對於小的整數和短字串,實際上python會快取這些物件,而不是針對每次賦值而分別建立和銷毀。但從邏輯層面上來說,上面的說法並沒有問題。我們將忽略這一細節)

a = 5b =a

a = a + 2

再看這個例子。通過前兩個句子,我們讓a,b指向同乙個整數物件5(b = a的含義是讓變數b指向變數a所指的那乙個物件)。但第三個句子實際上對變數a重新賦值,讓a指向乙個新的物件7。此時a,b分別指向不同的物件。我們看到,即使是多個變數指向同乙個物件,如果乙個變數值發生變化,那麼實際上是讓這個變數指向乙個新的變數,並不影響其他的變數的指向。從效果上看,就是各個變數各自獨立,互不影響。

不止是整數如此,其它資料物件也是如此:

l1 = [1,2,3]

l2 =l1

l1 = 1

但注意以下情況

l1 = [1,2,3]

l2 =l1

l1[0] = 10

print l2

在該情況下,我們不再對l1這一變數賦值,而是對l1所指向的表的元素賦值。結果是,l2也同時發生變化。

原因何在呢?因為l1,l2的指向沒有發生變化,依然指向那個表。表實際上是包含了多個變數的物件(每個變數是乙個元素,比如 l1[0],l1[1]..., 每個變數指向乙個物件,比如1,2,3), 。而l1[0] = 10這一賦值操作,並不是改變l1的指向,而是對l1[0], 也就是表物件的一部份(乙個元素),進行操作,所以所有指向該物件的變數都受到影響。

(與之形成對比的是,我們之前的賦值操作都沒有對物件自身發生作用,只是改變變數指向。)

像表這樣,可以通過引用元素,改變記憶體中的物件自身(in-place change)的物件型別,稱為可變資料物件(mutable object),詞典也是這樣的資料型別。

而像之前的數字和字串,不能改變物件本身,只能改變變數的指向,稱為不可變資料物件(immutable object)。我們之前學的定值表(tuple),儘管可以引用引用元素,但不可以通過賦值改變元素,也因此不能對物件本身進行改變,也是immutable object.

2. 從動態型別看函式的引數傳遞

函式的引數傳遞,實際上是讓函式的各個引數作為變數,指向物件。比如說:

def

f(x):

x = 100

print

xa = 1f(a)

print a

在呼叫函式f()時,實際上函式讓引數作為乙個變數,指向a所指的物件。如果引數是不可變(immutable)的物件,那麼如上面所講,各個變數之間相當於相互獨立。引數傳遞類似於c語言中的值傳遞。

如果是引數是可變(mutable)的物件,那麼存在有改變物件自身的可能性,所有指向該物件的變數(無論是函式中的引數,還是主程式中的變數)都會受影響,程式設計的時候要對此問題留心。比如說:

def

f(x):

x[0] = 100

print

xa = [1,2,3]

f(a)

print a

動態型別是python的核心機制之一。可以在應用中慢慢熟悉。

總結:變數和物件的分離,物件是記憶體中儲存資料的實體,變數指向物件。

可變物件,不可變物件

函式值傳遞

python動態型別

python是動態語言。不需要事先宣告變數型別,同一變數可以被賦值為不同的物件型別。不可變型別 不可變型別,物件一旦建立不可修改。整數型別 int 浮點數型別 float 複數型別 complex 字串型別 str 元祖型別 tuple 集合型別 set,都屬於不可變型別。下面通過變數賦值的過程理解...

Python動態型別

在python中,我們使用變數時,並沒有宣告變數的存在和型別。型別是在執行過程中自動決定的。a 3python將會執行三步去完成上面這個請求。1.建立乙個物件代表3 2.建立乙個變數a,如果a未建立。3.將變數a與物件3相連線。可以將變數a看作物件3的乙個引用。a 3 b a多個變數可以指向同乙個物...

Python 動態型別定義

動態型別以及由它提供的多型性,這個概念無疑是python語言的簡潔性和靈活性的基礎。在python中,並不會宣告指令碼中使用的物件的確切的型別。事實上,程式甚至可以不在意特定的型別 相反地,它們能夠自然地適用於更廣泛的場景下,因為動態型別是python語言靈活性的根源。變數建立 乙個變數,例如a,當...