與c、c++等靜態型別繫結的語言不同,python的型別是動態繫結的。也就是你在使用乙個變數的時候是不必對它的型別進行宣告的。這是python的強大之處。它使得python可以靈活的操作各種不同型別的變數。
它背後的機制是什麼呢?掌握幾個概念,就可以明白。
1.名字(name)與物件(object)
先說說什麼是物件,物件就是系統分配的一塊記憶體,這個記憶體可以有足夠的空間表示希望代表的value以及一些與該物件有關的資訊標記。
名字的作用就是用來指示乙個物件,使我們通過名字就可以對物件進行操作。
這就像生活中,每乙個人就相當於乙個物件,佔據一定的空間。而每個人都要有個名字,這個名字的作用只是起到乙個橋梁作用,當我們聽到乙個名字時可以聯絡到名字代表的那個「真正的」人。
2.python裡的物件
python
裡的物件毫無疑問也是一塊記憶體,它儲存的資訊除了物件本身代表的
value
還有型別,所以說在
python
中型別是與物件繫結的。
3.引用
所謂引用就是將乙個名字與乙個物件聯絡起來。就像乙個新生兒,父母想出了乙個名字,並將這個名字賦予他,於是名字與孩子之間就對應起來,這就是引用。
4.python的賦值機制
python中的賦值過程可以分成三步,以a = 3為例:
a.建立乙個物件用來表示3
b.起乙個名字a(如果之前沒有用過這個名字)
c.將名字a與物件聯絡起來。
ok,賦值完畢。
了解了這幾個概念,我們可以明白,在python中乙個變數並沒有型別,它的型別完全取決於它所指向的物件。
>>> a = 1
a代表的型別就是整數,因為它是對乙個整型數物件1的引用。
>>> a = 「hello world」,則a代表的型別就是字串,因為它是對字串型別物件」hello world」的引用。
python的這種動態型別繫結與賦值機制十分靈活。但也可能帶來一定風險。例如:
>>> a = [1, 2, 3]
>>> b = a
>>> a[0] = 4
>>> b
[4, 2, 3]
列表是一系列物件的集合。名字a是對列表物件[1, 2, 3]的引用,b = a因此b也是對[1, 2, 3]的引用,即a和b指向同乙個物件,這樣當a[0]被賦值為4時,相當於列表物件被改變了,即b所對應的物件被改變了。如果希望b的物件不被改變,可以使用copy.deepcopy()。系統將複製乙個與a所指向的物件值相同但處於不同記憶體空間的新物件,並將名字b與其關聯。
Python 多型與動態繫結
coding utf 8 class geometricobject def init self,color green filled true self.color color self.filled filled defgetcolor self return self.color defset...
動態型別 動態繫結 動態載入
1.動態型別 執行時才知道,物件的型別,動態型別在程式設計中非常常見,簡單的說就是id型別 比如 在自定的時候就是,id型別。當前我們有時候自己定的方法,不確定,傳進來的是什麼型別的物件,我們也id型別,然後在方法內部去確定型別 2.動態繫結 物件被例項化後,就確定的物件型別,也確定了物件的屬性和響...
Python的動態繫結與賦值機制
文章出處 與c c 等靜態型別繫結的語言不同,python的型別是動態繫結的。也就是你在使用乙個變數的時候是不必對它的型別進行宣告的。這是python的強大之處。它使得python可以靈活的操作各種不同型別的變數。它背後的機制是什麼呢?掌握幾個概念,就可以明白。1.名字 name 與物件 objec...