国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

跟老齊學Python之深入變量和引用對象

2019-11-25 18:12:16
字體:
來源:轉載
供稿:網友

在《永遠強大的函數》那一講中,老齊我已經向看官們簡述了一下變量,之后我們就一直在使用變量,每次使用變量,都要有一個操作,就是賦值。本講再次提及這個兩個事情,就是要讓看官對變量和賦值有一個知其然和知其所以然的認識。當然,最后能不能達到此目的,主要看我是不是說的通俗易懂了。如果您沒有明白,就說明我說的還不夠好,可以聯系我,我再為您效勞。

變量和對象

在《learning python》那本書里面,作者對變量、對象和引用的關系闡述的非常明了。我這里在很大程度上是受他的啟發。感謝作者Mark Lutz先生的巨著。

應用《learning python》中的一個觀點:變量無類型,對象有類型

在python中,如果要使用一個變量,不需要提前聲明,只需要在用的時候,給這個變量賦值即可。這里特別強調,只要用一個變量,就要給這個變量賦值。

所以,像這樣是不行的。

復制代碼 代碼如下:

>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

 反復提醒:一定要注意看報錯信息。如果光光地寫一個變量,而沒有賦值,那么python認為這個變量沒有定義。賦值,不僅僅是給一個非空的值,也可以給一個空值,如下,都是允許的

復制代碼 代碼如下:

>>> x = 3
>>> lst = []
>>> word = ""
>>> my_dict = {}

 在前面講述中,我提出了一個類比,就是變量通過一根線,連著對象(具體就可能是一個int/list等),這個類比被很多人接受了,算是我老齊的首創呀。那么,如果要用一種嚴格的語言來描述,變量可以理解為一個系統表的元素,它擁有過指向對象的命名空間。太嚴肅了,不好理解,就理解我那個類比吧。變量就是存在系統中的一個東西,這個東西有一種能力,能夠用一根線與某對象連接,它能夠釣魚。

對象呢?展開想象。在機器的內存中,系統分配一個空間,這里面就放著所謂的對象,有時候放數字,有時候放字符串。如果放數字,就是int類型,如果放字符串,就是str類型。

接下來的事情,就是前面說的變量用自己所擁有的能力,把對象和自己連接起來(指針連接對象空間),這就是引用。引用完成,就實現了賦值。

看到上面的圖了吧,從圖中就比較鮮明的表示了變量和對象的關系。所以,嚴格地將,只有放在內存空間中的對象(也就是數據)才有類型,而變量是沒有類型的。這么說如果還沒有徹底明白,就再打一個比喻:變量就好比釣魚的人,湖水里就好像內存,里面有好多魚,有各種各樣的魚,它們就是對象。釣魚的人(變量)的任務就是用某種方式(魚兒引誘)把自己和魚通過魚線連接起來。那么,魚是有類型的,有鰱魚、鯽魚、帶魚(帶魚也跑到湖水了了,難道是淡水帶魚?呵呵,就這么扯淡吧,別較真),釣魚的人(變量)沒有這種類型,他釣到不同類型的魚。

這個比喻太爛了。湊合著理解吧。看官有好的比喻,別忘記分享。

同一個變量可以同時指向兩個對象嗎?絕對不能腳踩兩只船。如果這樣呢?

復制代碼 代碼如下:

>>> x = 4
>>> x = 5
>>> x
5

 變量x先指向了對象4,然后指向對象5,當后者放生的時候,自動跟第一個對象4接觸關系。再看x,引用的對象就是5了。那么4呢?一旦沒有變量引用它了,它就變成了孤魂野鬼。python是很吝嗇的,它絕對不允許在內存中存在孤魂野鬼。凡是這些東西都被看做垃圾,而對垃圾,python有一個自動的收回機制。

在網上找了一個圖示說明,很好,引用過來(來源:http://www.linuxidc.com/Linux/2012-09/69523.htm

復制代碼 代碼如下:

>>> a = 100         #完成了變量a對內存空間中的對象100的引用

 如下圖所示:

然后,又操作了:

復制代碼 代碼如下:

>>> a = "hello"

 如下圖所示:

原來內存中的那個100就做為垃圾被收集了。而且,這個收集過程是python自動完成的,不用我們操心。

那么,python是怎么進行垃圾收集的呢?在Quora上也有人問這個問題,我看那個回答很精彩,做個鏈接,有性趣的讀一讀吧。Python (programming language): How does garbage collection in Python work?

is和==的效果

以上過程的原理搞清楚了,下面就可以深入一步了。

復制代碼 代碼如下:

>>> l1 = [1,2,3]
>>> l2 = l1

 這個操作中,l1和l2兩個變量,引用的是一個對象,都是[1,2,3]。何以見得?如果通過l1來修改[1,2,3],l2引用對象也修改了,那么就證實這個觀點了。

復制代碼 代碼如下:

>>> l1[0] = 99      #把對象變為[99,2,3]
>>> l1              #變了
[99, 2, 3]
>>> l2             #真的變了 主站蜘蛛池模板: 越西县| 共和县| 会同县| 紫云| 嫩江县| 浦东新区| 永春县| 西平县| 尚志市| 桦川县| 习水县| 庄河市| 凭祥市| 出国| 罗田县| 西贡区| 阜城县| 钟祥市| 仁怀市| 平江县| 双柏县| 晴隆县| 彭水| 民乐县| 百色市| 宁德市| 庆安县| 曲靖市| 宜章县| 武威市| 克什克腾旗| 灵丘县| 神农架林区| 大兴区| 鹤峰县| 黄石市| 蕉岭县| 黑水县| 斗六市| 习水县| 灌云县|