1、變量、對象、引用及其關係:學習
從舉例說明Python建立變量的步驟:a = 3;測試
Python將會執行3個不一樣的步驟去完成這個請求。這些步驟反應了Python語言中全部賦值的操做:spa
一、建立一個對象來表明值3;指針
二、建立一個變量a,若是它還沒被建立的話;對象
三、講變量與新的對象3鏈接。內存
實際效果是如圖所示的在一個Python的內部結構。變量和對象在內存中的不一樣部分,並經過鏈接相關聯(這個鏈接在圖中顯示爲一個箭頭)。變量老是鏈接到對象,而且毫不會鏈接到其餘變量上,可是更大的對象可能鏈接到其餘對象(例如,一個列表對象可以鏈接到它所包含的對象)。變量名和對象,在運行a = 3後,變量a變成對象3的一個引用。在內部,變量事實上是到對象內存空間(經過運行常量表達式3而建立)的一個指針。ci
在Python中從變量到對象的鏈接稱做引用。也就是說,引用是一種關係,之內存中的指針的形式實現。一旦變量被使用(也就是說被引用),Python自動跟隨這個變量到對象的鏈接。以具體的術語來說:
變量
· 變量是一個系統表的元素,擁有指向對象的鏈接的空間。
引用
· 對象是被分配的一塊內存,有足夠的空間去表現他們所表明的值。
請求
· 引用是自動造成的從變量到對象的指針。
在腳本中,每個經過運行一個表達式生成一個新的值,Python都建立了一個對象(一個內存)去表現這個值。從邏輯的角度看,這工做起來就像每個表達式結構的值都是一個不一樣的對象,而每個對象都是不一樣的內存。
從技術上講,對象有更復雜的結構而不單單是有足夠的空間去表現它的值那麼簡單。每個對象都有兩個標準的頭部信息:一個類型標識符去標識這個對象的類型,以及一個引用計數器,用來決定是否是能夠回收這個對象。
變量沒有類型,類型屬於對象,而不是變量名。
每當一個變量名被賦予了一個新的對象,以前的那個對象佔用的空間就會被回收(若是它沒有被其餘變量名所引用的話)。這種自動回收對象空間的技術稱做垃圾收集。在內部,Python是經過保持用每一個對象中計數器記錄引用到這個對象上的次數來完成這一功能的。一旦(並精確在同一時間)這個計數器被設置爲零,這個對象的內存空間就會自動回收。
2、共享引用
>>> a = 3
>>> b = a
輸入這兩行語句後,生成如圖結果:
第二行會使Python建立變量b。使用的是變量a,而且它在這裏沒有被賦值,因此它被替換成其引用的對象3,從而b也成爲這個對象的一個引用。實際的效果就是變量a和變量b都引用了相同的對象(也就是說,指向了相同的內存空間)。這在Python中稱爲共享引用——多個變量名引用了同一個變量。
給一個變量賦一個新的值,並非替換了原始的對象,而是讓這個變量去引用另外一個對象。
注:分片是對對象的拷貝
共享引用和相等:
Eg:
>>> L = [1, 2, 3]
>>> M = L
>>> L == M
True
>>> L is M
True
這裏的第一種技術「==操做符」,測試兩個被引用對象是否有相同的值。這種方法每每在Python中用做相等的檢查。第二種方法「is操做符」,是在檢查對象的同一性。若是兩個變量名精確地指向同一個對象,它會返回True,因此這是一種更嚴格形式的相等測試。
實際上,is只是比較實現引用的指針,因此若是必要的話是代碼中檢測共享引用的一種辦法。若是變量名引用值相等,但爲不一樣對象,它的返回值是False。
Eg:
>>> L = [1, 2, 3]
>>> M = [1, 2, 3]
>>> L == M
True
>>> L is M
False
參考文獻:《Python學習手冊 第三版》