Python学习之变量、对象和引用
Python學習之變量、對象和引用
文章目錄
- Python學習之變量、對象和引用
- 問題的引出
- 變量創建
- 變量類型
- 變量使用
- 動態類型
- 類型屬于對象,而不是變量
- 對象的垃圾收集
- 參考資料
問題的引出
當在Python中運行賦值語句a=3時,熟悉C語言的朋友肯定會感到奇怪:難道變量a不需要定義嗎?Python是怎么知道變量a的類型的?
變量創建
一個變量(也就是變量名),就像a,當代碼第一次給它賦值的時候就創建了它。之后的賦值會改變已創建的變量名的值。其實,說得更嚴格一點,這叫“名稱綁定”。
名稱用于指代對象(你可以理解為名稱是一個指向對象的指針)。名稱是通過名稱綁定操作來引入的。以下構造會綁定名稱:傳給函數的正式形參,import語句,類定義,函數定義,以標識符為目標的賦值,for循環的開頭等等等等。
對于初學者,只要記住 以標識符為目標的賦值會綁定名稱 就可以了。
變量類型
變量永遠不會有任何的和它關聯的類型信息或約束。類型的概念是存在于對象中而不是變量名中。變量是通用的,它只是在一個特定的時間點,簡單地引用了一個特定的對象而已。
變量使用
當變量出現在表達式中時,它會馬上被當前引用的對象所代替,無論這個對象是什么類型。此外,所有的變量必須在其使用前明確地賦值,使用未賦值的變量會產生錯誤。
動態類型
如果清楚地將變量名和對象劃分開來,動態類型是很容易理解的。例如:
>>> a = 3對于上面的賦值操作,Python會執行三個不同的步驟去完成這個請求:
實際的效果如下圖:
Names and objects after running the assignment a = 3. Variable a becomes a reference to the object 3. Internally, the variable is really a pointer to the object’s memory space created by running the literal expression 3.
如圖所示,變量和對象保存在內存中的不同部分,并通過連接相關聯(這個連接在圖中表示為一個箭頭)。變量總是連接到對象,并且絕不會連接到其他變量上,但是更大的對象可能連接到其他的對象(例如,一個列表對象能夠連接到它所包含的對象)。
在Python中從變量到對象的連接稱作引用(reference)。也就是說,引用是一種關系,類似于C語言的指針。
要點:
- 變量是一個系統表的元素,擁有指向對象的連接的空間。
- 對象是分配的一塊內存,有足夠的空間去表示它所代表的值。
- 引用是自動形成的從變量到對象的指針。
類型屬于對象,而不是變量
每一個對象都有兩個標準的頭部信息:一個類型標識符和一個引用計數器。類型標識符用來標識這個對象的類型,引用計數器用來決定是否可以回收這個對象。
對象的垃圾收集
在Python中,每當一個變量名被賦值給了一個新對象,之前那個對象占用的空間就會被回收(如果它沒有被其他的變量名或對象所引用的話)。這種自動回收對象空間的技術叫垃圾收集。
在下面的例子中,每個語句都把變量名x賦值為不同的對象:
>>> x = 42 >>> x = 'hello' >>> x = 3.14159 >>> x = [1,2,3]首先注意x每次被設置為不同的對象。再者,盡管這不是真正的情況,效果卻是x的類型每次都在改變。
第二,每一次x被賦值給一個新的對象,Python都回收了舊對象的空間。例如,當執行x = 'hello'時,對象42馬上被回收(假設它沒有被其他的變量名或者對象所引用)。
在內部,Python是這樣來實現這一功能的:它在每個對象中保持了一個計數器,計數器記錄了當前指向該對象的引用的數目。一旦(并精確在同一時間)這個計數器被設置為0,這個對象的內存空間就會被自動回收。在前面的介紹中,假設每次x都被賦值給一個新的對象,而前面的一個對象的引用計數器變為0,就會導致它的的空間被回收。
垃圾收集最直接的好處就是可以在代碼中任意使用對象而不需要考慮釋放內存空間。與C語言這樣的底層語言相比,真是給程序員省了不少麻煩。
【End】
參考資料
《Python學習手冊(第4版)》,機械工業出版社
總結
以上是生活随笔為你收集整理的Python学习之变量、对象和引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 学习之作用域
- 下一篇: Python学习之共享引用