在《永遠(yuǎn)強(qiáng)大的函數(shù)》那一講中,老齊我已經(jīng)向看官們簡述了一下變量,之后我們就一直在使用變量,每次使用變量,都要有一個(gè)操作,就是賦值。本講再次提及這個(gè)兩個(gè)事情,就是要讓看官對變量和賦值有一個(gè)知其然和知其所以然的認(rèn)識。當(dāng)然,最后能不能達(dá)到此目的,主要看我是不是說的通俗易懂了。如果您沒有明白,就說明我說的還不夠好,可以聯(lián)系我,我再為您效勞。
變量和對象
在《learning python》那本書里面,作者對變量、對象和引用的關(guān)系闡述的非常明了。我這里在很大程度上是受他的啟發(fā)。感謝作者M(jìn)ark Lutz先生的巨著。
應(yīng)用《learning python》中的一個(gè)觀點(diǎn):變量無類型,對象有類型
在python中,如果要使用一個(gè)變量,不需要提前聲明,只需要在用的時(shí)候,給這個(gè)變量賦值即可。這里特別強(qiáng)調(diào),只要用一個(gè)變量,就要給這個(gè)變量賦值。
所以,像這樣是不行的。
代碼如下:
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
反復(fù)提醒:一定要注意看報(bào)錯(cuò)信息。如果光光地寫一個(gè)變量,而沒有賦值,那么python認(rèn)為這個(gè)變量沒有定義。賦值,不僅僅是給一個(gè)非空的值,也可以給一個(gè)空值,如下,都是允許的
代碼如下:
>>> x = 3
>>> lst = []
>>> word = ""
>>> my_dict = {}
在前面講述中,我提出了一個(gè)類比,就是變量通過一根線,連著對象(具體就可能是一個(gè)int/list等),這個(gè)類比被很多人接受了,算是我老齊的首創(chuàng)呀。那么,如果要用一種嚴(yán)格的語言來描述,變量可以理解為一個(gè)系統(tǒng)表的元素,它擁有過指向?qū)ο蟮拿臻g。太嚴(yán)肅了,不好理解,就理解我那個(gè)類比吧。變量就是存在系統(tǒng)中的一個(gè)東西,這個(gè)東西有一種能力,能夠用一根線與某對象連接,它能夠釣魚。
對象呢?展開想象。在機(jī)器的內(nèi)存中,系統(tǒng)分配一個(gè)空間,這里面就放著所謂的對象,有時(shí)候放數(shù)字,有時(shí)候放字符串。如果放數(shù)字,就是int類型,如果放字符串,就是str類型。
接下來的事情,就是前面說的變量用自己所擁有的能力,把對象和自己連接起來(指針連接對象空間),這就是引用。引用完成,就實(shí)現(xiàn)了賦值。
看到上面的圖了吧,從圖中就比較鮮明的表示了變量和對象的關(guān)系。所以,嚴(yán)格地將,只有放在內(nèi)存空間中的對象(也就是數(shù)據(jù))才有類型,而變量是沒有類型的。這么說如果還沒有徹底明白,就再打一個(gè)比喻:變量就好比釣魚的人,湖水里就好像內(nèi)存,里面有好多魚,有各種各樣的魚,它們就是對象。釣魚的人(變量)的任務(wù)就是用某種方式(魚兒引誘)把自己和魚通過魚線連接起來。那么,魚是有類型的,有鰱魚、鯽魚、帶魚(帶魚也跑到湖水了了,難道是淡水帶魚?呵呵,就這么扯淡吧,別較真),釣魚的人(變量)沒有這種類型,他釣到不同類型的魚。
新聞熱點(diǎn)
疑難解答
圖片精選