一、基本原理
Python中一切都是對象,變量中存放的是對象的引用。這是一個普遍的法則。我們舉個例子來說,Python是如何來處理的。
當python執行上面第一句的時候,會在heap中首先創建一個str對象,其文本內容為blue,同時還創建一個名為x的對象引用,x引用的就是這個str對象。第二句也是類似;第三條創建了一個名為z的新對象引用,並將其設置為對象引用x所指向的相同對象。如下圖的變化。
所以看出在Python中賦值操作符號“=”的作用是,將對象引用和內存中的某個對象進行綁定。如果對象已經存在,就進行簡單的重新綁定,以便引用“=”右邊的對象;如果對象引用尚未存在,就首先創建對象,然後將對象引用和對象進行綁定。這很類似與c中的指針的概念。
Python使用“動態類型”機制,也就是說,在Python程序中,任何時候可以根據需要,某個對象引用都可以重新綁定到另一個不同的對象上(不要求是相同的類型),這和其他強化型語言如(C++,Java)不太一樣,只允許重新綁定相同類型的對象上。在Python中,因為有“動態類型”機制,所以一個對象引用可以執行不同類型的對象適用的方法。當一個對象不存在任何對象引用的時候,就進入了垃圾收集的過程。
第一句 a = 100
Python會在heap創建一個int對象,其內容為100,同時創建a變量,其值指向heap中的int對象
第二句 a/10
Python適用“動態類型”機制,判斷a指向的對象是int型,可以適用/(除法)操作。於是便進行運算產生結果。(它會在heap中在創建一個10.0的對象麼?)
第三句 a[0]
Python適用“動態類型”機制,判斷a指向的對象是int型,並不適用[](分片)操作。於是就進行報錯。
第四句 a = 'hello'
Python會在heap創建一個str對象,其內容為hello,同時改變a變量,使得其值指向heap中的str對象。同時原來的int對象,由於不在存在對象引用,所以就進入了垃圾收集過程。
第五句 a[0]
Python適用“動態類型”機制,判斷a指向的對象是str型,可以適用[](分片)操作。於是便進行運算產生結果。
第六句 a/10
Python適用“動態類型”機制,判斷a指向的對象是str型,並不適用/(除法)操作。於是就進行報錯。
總之 :在Python中一切都是對象,變量總是存放對象引用。當一個對象沒有變量指向它的時候,它便進入了垃圾收集過程。Python的“動態類型”機制,負責檢查變量的對象引用適用操作。如果該對象不適用該操作,則會直接報錯。一句話”變量無類型,對象有類型 “