摘要:為所有在災(zāi)難中受傷害的人們獻(xiàn)上禱告。變量就是存在系統(tǒng)中的一個(gè)東西,這個(gè)東西有一種能力,能夠用一根線與某對(duì)象連接,它能夠釣魚(yú)。這個(gè)操作中,和兩個(gè)變量,引用的是一個(gè)對(duì)象,都是。所以,當(dāng)通過(guò)修改引用對(duì)象的后,沒(méi)有變化。
今天是2014年8月4日,這段時(shí)間災(zāi)禍接連發(fā)生,顯示不久前昆山的工廠爆炸,死傷不少,然后是云南地震,也有死傷。為所有在災(zāi)難中受傷害的人們獻(xiàn)上禱告。
在《永遠(yuǎn)強(qiáng)大的函數(shù)》那一講中,老齊我(http://qiwsir.github.io)已經(jīng)向看官們簡(jiǎn)述了一下變量,之后我們就一直在使用變量,每次使用變量,都要有一個(gè)操作,就是賦值。本講再次提及這個(gè)兩個(gè)事情,就是要讓看官對(duì)變量和賦值有一個(gè)知其然和知其所以然的認(rèn)識(shí)。當(dāng)然,最后能不能達(dá)到此目的,主要看我是不是說(shuō)的通俗易懂了。如果您沒(méi)有明白,就說(shuō)明我說(shuō)的還不夠好,可以聯(lián)系我,我再為您效勞。
變量和對(duì)象在《learning python》那本書(shū)里面,作者對(duì)變量、對(duì)象和引用的關(guān)系闡述的非常明了。我這里在很大程度上是受他的啟發(fā)。感謝作者M(jìn)ark Lutz先生的巨著。
應(yīng)用《learning python》中的一個(gè)觀點(diǎn):變量無(wú)類型,對(duì)象有類型
在python中,如果要使用一個(gè)變量,不需要提前聲明,只需要在用的時(shí)候,給這個(gè)變量賦值即可。這里特別強(qiáng)調(diào),只要用一個(gè)變量,就要給這個(gè)變量賦值。
所以,像這樣是不行的。
>>> x Traceback (most recent call last): File "", line 1, in NameError: name "x" is not defined
反復(fù)提醒:一定要注意看報(bào)錯(cuò)信息。如果光光地寫(xiě)一個(gè)變量,而沒(méi)有賦值,那么python認(rèn)為這個(gè)變量沒(méi)有定義。賦值,不僅僅是給一個(gè)非空的值,也可以給一個(gè)空值,如下,都是允許的
>>> x = 3 >>> lst = [] >>> word = "" >>> my_dict = {}
在前面講述中,我提出了一個(gè)類比,就是變量通過(guò)一根線,連著對(duì)象(具體就可能是一個(gè)int/list等),這個(gè)類比被很多人接受了,算是我老齊的首創(chuàng)呀。那么,如果要用一種嚴(yán)格的語(yǔ)言來(lái)描述,變量可以理解為一個(gè)系統(tǒng)表的元素,它擁有過(guò)指向?qū)ο蟮拿臻g。太嚴(yán)肅了,不好理解,就理解我那個(gè)類比吧。變量就是存在系統(tǒng)中的一個(gè)東西,這個(gè)東西有一種能力,能夠用一根線與某對(duì)象連接,它能夠釣魚(yú)。
對(duì)象呢?展開(kāi)想象。在機(jī)器的內(nèi)存中,系統(tǒng)分配一個(gè)空間,這里面就放著所謂的對(duì)象,有時(shí)候放數(shù)字,有時(shí)候放字符串。如果放數(shù)字,就是int類型,如果放字符串,就是str類型。
接下來(lái)的事情,就是前面說(shuō)的變量用自己所擁有的能力,把對(duì)象和自己連接起來(lái)(指針連接對(duì)象空間),這就是引用。引用完成,就實(shí)現(xiàn)了賦值。
看到上面的圖了吧,從圖中就比較鮮明的表示了變量和對(duì)象的關(guān)系。所以,嚴(yán)格地將,只有放在內(nèi)存空間中的對(duì)象(也就是數(shù)據(jù))才有類型,而變量是沒(méi)有類型的。這么說(shuō)如果還沒(méi)有徹底明白,就再打一個(gè)比喻:變量就好比釣魚(yú)的人,湖水里就好像內(nèi)存,里面有好多魚(yú),有各種各樣的魚(yú),它們就是對(duì)象。釣魚(yú)的人(變量)的任務(wù)就是用某種方式(魚(yú)兒引誘)把自己和魚(yú)通過(guò)魚(yú)線連接起來(lái)。那么,魚(yú)是有類型的,有鰱魚(yú)、鯽魚(yú)、帶魚(yú)(帶魚(yú)也跑到湖水了了,難道是淡水帶魚(yú)?呵呵,就這么扯淡吧,別較真),釣魚(yú)的人(變量)沒(méi)有這種類型,他釣到不同類型的魚(yú)。
這個(gè)比喻太爛了。湊合著理解吧。看官有好的比喻,別忘記分享。
同一個(gè)變量可以同時(shí)指向兩個(gè)對(duì)象嗎?絕對(duì)不能腳踩兩只船。如果這樣呢?
>>> x = 4 >>> x = 5 >>> x 5
變量x先指向了對(duì)象4,然后指向?qū)ο?,當(dāng)后者放生的時(shí)候,自動(dòng)跟第一個(gè)對(duì)象4接觸關(guān)系。再看x,引用的對(duì)象就是5了。那么4呢?一旦沒(méi)有變量引用它了,它就變成了孤魂野鬼。python是很吝嗇的,它絕對(duì)不允許在內(nèi)存中存在孤魂野鬼。凡是這些東西都被看做垃圾,而對(duì)垃圾,python有一個(gè)自動(dòng)的收回機(jī)制。
在網(wǎng)上找了一個(gè)圖示說(shuō)明,很好,引用過(guò)來(lái)(來(lái)源:http://www.linuxidc.com/Linux/2012-09/69523.htm)
>>> a = 100 #完成了變量a對(duì)內(nèi)存空間中的對(duì)象100的引用
如下圖所示:
然后,又操作了:
>>> a = "hello"
如下圖所示:
原來(lái)內(nèi)存中的那個(gè)100就做為垃圾被收集了。而且,這個(gè)收集過(guò)程是python自動(dòng)完成的,不用我們操心。
那么,python是怎么進(jìn)行垃圾收集的呢?在Quora上也有人問(wèn)這個(gè)問(wèn)題,我看那個(gè)回答很精彩,做個(gè)鏈接,有性趣的讀一讀吧。Python (programming language): How does garbage collection in Python work?
is和==的效果以上過(guò)程的原理搞清楚了,下面就可以深入一步了。
>>> l1 = [1,2,3] >>> l2 = l1
這個(gè)操作中,l1和l2兩個(gè)變量,引用的是一個(gè)對(duì)象,都是[1,2,3]。何以見(jiàn)得?如果通過(guò)l1來(lái)修改[1,2,3],l2引用對(duì)象也修改了,那么就證實(shí)這個(gè)觀點(diǎn)了。
>>> l1[0] = 99 #把對(duì)象變?yōu)閇99,2,3] >>> l1 #變了 [99, 2, 3] >>> l2 #真的變了吔 [99, 2, 3]
再換一個(gè)方式:
>>> l1 = [1,2,3] >>> l2 = [1,2,3] >>> l1[0] = 99 >>> l1 [99, 2, 3] >>> l2 [1, 2, 3]
l1和l2貌似指向了同樣的一個(gè)對(duì)象[1,2,3],其實(shí),在內(nèi)存中,這是兩塊東西,互不相關(guān)。只是在內(nèi)容上一樣。就好像是水里長(zhǎng)的一樣的兩條魚(yú),兩個(gè)人都釣到了,當(dāng)不是同一條。所以,當(dāng)通過(guò)l1修改引用對(duì)象的后,l2沒(méi)有變化。
進(jìn)一步還能這么檢驗(yàn):
>>> l1 [1, 2, 3] >>> l2 [1, 2, 3] >>> l1 == l2 #兩個(gè)相等,是指內(nèi)容一樣 True >>> l1 is l2 #is 是比較兩個(gè)引用對(duì)象在內(nèi)存中的地址是不是一樣 False #前面的檢驗(yàn)已經(jīng)說(shuō)明,這是兩個(gè)東東 >>> l3 = l1 #順便看看如果這樣,l3和l1應(yīng)用同一個(gè)對(duì)象 >>> l3 [1, 2, 3] >>> l3 == l1 True >>> l3 is l1 #is的結(jié)果是True True
某些對(duì)象,有copy函數(shù),通過(guò)這個(gè)函數(shù)得到的對(duì)象,是一個(gè)新的還是引用到同一個(gè)對(duì)象呢?看官也可以做一下類似上面的實(shí)驗(yàn),就曉得了。比如:
>>> l1 [1, 2, 3] >>> l2 = l1[:] >>> l2 [1, 2, 3] >>> l1[0] = 22 >>> l1 [22, 2, 3] >>> l2 [1, 2, 3] >>> adict = {"name":"qiwsir","web":"qiwsir.github.io"} >>> bdict = adict.copy() >>> bdict {"web": "qiwsir.github.io", "name": "qiwsir"} >>> adict["email"] = "qiwsir@gmail.com" >>> adict {"web": "qiwsir.github.io", "name": "qiwsir", "email": "qiwsir@gmail.com"} >>> bdict {"web": "qiwsir.github.io", "name": "qiwsir"}
不過(guò),看官還有小心有點(diǎn),python不總按照前面說(shuō)的方式出牌,比如小數(shù)字的時(shí)候
>>> x = 2 >>> y = 2 >>> x is y True >>> x = 200000 >>> y = 200000 >>> x is y #什么道理呀,小數(shù)字的時(shí)候,就用緩存中的. False >>> x = "hello" >>> y = "hello" >>> x is y True >>> x = "what is you name?" >>> y = "what is you name?" >>> x is y #不光小的數(shù)字,短的字符串也是 False
賦值是不是簡(jiǎn)單地就是等號(hào)呢?從上面得出來(lái),=的作用就是讓變量指針指向某個(gè)對(duì)象。不過(guò),還可以再深入一些。走著瞧吧。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37338.html
摘要:函數(shù)的基本結(jié)構(gòu)中的函數(shù)基本結(jié)構(gòu)函數(shù)名參數(shù)列表語(yǔ)句幾點(diǎn)說(shuō)明函數(shù)名的命名規(guī)則要符合中的命名要求。在中,將這種依賴關(guān)系,稱之為多態(tài)。不要期待在原處修改的函數(shù)會(huì)返回結(jié)果比如一定要之用括號(hào)調(diào)用函數(shù)不要在導(dǎo)入和重載中使用擴(kuò)展名或路徑。 在本教程的開(kāi)始部分,就已經(jīng)引入了函數(shù)的概念:《永遠(yuǎn)強(qiáng)大的函數(shù)》,之所以那時(shí)候就提到函數(shù),是因?yàn)槲矣X(jué)得函數(shù)之重要,遠(yuǎn)遠(yuǎn)超過(guò)一般。這里,重回函數(shù),一是復(fù)習(xí),二是要在已經(jīng)...
摘要:畫(huà)圈換一個(gè)說(shuō)法就是循環(huán)。就相當(dāng)于讓依次等于中的各個(gè)值。例找出以內(nèi)的能夠被整除的正整數(shù)。以上做了簡(jiǎn)單分析,要實(shí)現(xiàn)流程,還需要細(xì)化一下。代碼代碼運(yùn)行結(jié)果這里僅僅列舉一個(gè)簡(jiǎn)單的例子,看官可以在這個(gè)例子基礎(chǔ)上深入打印某范圍內(nèi)的偶數(shù)奇數(shù)等。 畫(huà)圈?換一個(gè)說(shuō)法就是循環(huán)。循環(huán),是高級(jí)語(yǔ)言編程中重要的工作。現(xiàn)實(shí)生活中,很多事情都是在循環(huán),日月更迭,斗轉(zhuǎn)星移,無(wú)不是循環(huán);王朝更迭,尋常百姓,也都是循環(huán)。...
摘要:接下來(lái),一般都要編寫(xiě)構(gòu)造函數(shù),在寫(xiě)這個(gè)函數(shù)之前,先解釋一下什么是構(gòu)造函數(shù)。故這個(gè)函數(shù)稱為構(gòu)造函數(shù),擔(dān)負(fù)著對(duì)類進(jìn)行初始化的任務(wù)。 雖然已經(jīng)對(duì)類有了一點(diǎn)點(diǎn)模糊概念,但是,閱讀前面一講的內(nèi)容的確感到累呀,都是文字,連代碼都沒(méi)有。 本講就要簡(jiǎn)單多了,嘗試走一個(gè)類的流程。 說(shuō)明:關(guān)于類的這部分,我參考了《Learning Python》一書(shū)的講解。 創(chuàng)建類 創(chuàng)建類的方法比較簡(jiǎn)單,如下: ...
摘要:在對(duì)象接口后包裝其實(shí)現(xiàn)的細(xì)節(jié),從而隔離了代碼的修改對(duì)用戶產(chǎn)生的影響。類提供了一個(gè)新的本地作用域,最小化了變量名沖突。類其實(shí)并沒(méi)有結(jié)束,不過(guò)本講座到此對(duì)類暫告一段。 前面對(duì)類的有關(guān)內(nèi)容已經(jīng)描述不少了,其實(shí)話題遠(yuǎn)遠(yuǎn)沒(méi)有結(jié)束,不過(guò)對(duì)于初學(xué)者,掌握這些已經(jīng)算是入門(mén),在以后的實(shí)踐中,還需要進(jìn)行體會(huì)和感悟。 這幾天和幾個(gè)朋友以各種途徑討論過(guò)OOP的相關(guān)問(wèn)題,他們是:令狐蟲(chóng)、Frank、晉劍、小馮...
摘要:在學(xué)生時(shí)代,就羨慕實(shí)驗(yàn)室,老師在里面可以鼓搗各種有意思的東西。再后來(lái),終于發(fā)現(xiàn)原來(lái)計(jì)算機(jī)是一個(gè)最好的實(shí)驗(yàn)室。通過(guò)實(shí)驗(yàn),研究清楚了,才能在編程實(shí)踐中使用。其實(shí),這就是一個(gè)非常好的實(shí)驗(yàn)室。 在學(xué)生時(shí)代,就羨慕實(shí)驗(yàn)室,老師在里面可以鼓搗各種有意思的東西。上大學(xué)的時(shí)候,終于有機(jī)會(huì)在實(shí)驗(yàn)室做大量實(shí)驗(yàn)了,因?yàn)槲沂俏锢硐担⑶遥龅搅艘晃环浅A钗易鹁吹睦蠋煛呃蠋煟屛以谒膶?shí)驗(yàn)室里面,把所有已經(jīng)...
閱讀 1265·2021-11-24 09:39
閱讀 1514·2021-09-07 09:59
閱讀 3479·2019-08-30 15:54
閱讀 2474·2019-08-30 11:00
閱讀 2669·2019-08-29 15:06
閱讀 2159·2019-08-26 13:52
閱讀 427·2019-08-26 13:24
閱讀 2488·2019-08-26 12:20