成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[零基礎學Python]深入變量和引用對象

yagami / 2132人閱讀

摘要:為所有在災難中受傷害的人們獻上禱告。變量就是存在系統(tǒng)中的一個東西,這個東西有一種能力,能夠用一根線與某對象連接,它能夠釣魚。這個操作中,和兩個變量,引用的是一個對象,都是。所以,當通過修改引用對象的后,沒有變化。

今天是2014年8月4日,這段時間災禍接連發(fā)生,顯示不久前昆山的工廠爆炸,死傷不少,然后是云南地震,也有死傷。為所有在災難中受傷害的人們獻上禱告。

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

變量和對象

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

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

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

所以,像這樣是不行的。

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

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

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

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

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

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

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

這個比喻太爛了。湊合著理解吧??垂儆泻玫谋扔鳎瑒e忘記分享。

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

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

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

在網(wǎng)上找了一個圖示說明,很好,引用過來(來源: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      #把對象變?yōu)閇99,2,3]
>>> l1              #變了
[99, 2, 3]
>>> l2             #真的變了吔
[99, 2, 3]

再換一個方式:

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

l1和l2貌似指向了同樣的一個對象[1,2,3],其實,在內存中,這是兩塊東西,互不相關。只是在內容上一樣。就好像是水里長的一樣的兩條魚,兩個人都釣到了,當不是同一條。所以,當通過l1修改引用對象的后,l2沒有變化。

進一步還能這么檢驗:

>>> l1
[1, 2, 3]
>>> l2
[1, 2, 3]
>>> l1 == l2    #兩個相等,是指內容一樣
True
>>> l1 is l2    #is 是比較兩個引用對象在內存中的地址是不是一樣
False          #前面的檢驗已經(jīng)說明,這是兩個東東

>>> l3 = l1   #順便看看如果這樣,l3和l1應用同一個對象
>>> l3
[1, 2, 3]
>>> l3 == l1
True
>>> l3 is l1    #is的結果是True
True

某些對象,有copy函數(shù),通過這個函數(shù)得到的對象,是一個新的還是引用到同一個對象呢?看官也可以做一下類似上面的實驗,就曉得了。比如:

>>> 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"] = "[email protected]"
>>> adict
{"web": "qiwsir.github.io", "name": "qiwsir", "email": "[email protected]"}
>>> bdict
{"web": "qiwsir.github.io", "name": "qiwsir"}

不過,看官還有小心有點,python不總按照前面說的方式出牌,比如小數(shù)字的時候

>>> x = 2
>>> y = 2
>>> x is y
True
>>> x = 200000
>>> y = 200000
>>> x is y      #什么道理呀,小數(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

賦值是不是簡單地就是等號呢?從上面得出來,=的作用就是讓變量指針指向某個對象。不過,還可以再深入一些。走著瞧吧。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/37338.html

相關文章

  • [基礎python]重回函數(shù)

    摘要:函數(shù)的基本結構中的函數(shù)基本結構函數(shù)名參數(shù)列表語句幾點說明函數(shù)名的命名規(guī)則要符合中的命名要求。在中,將這種依賴關系,稱之為多態(tài)。不要期待在原處修改的函數(shù)會返回結果比如一定要之用括號調用函數(shù)不要在導入和重載中使用擴展名或路徑。 在本教程的開始部分,就已經(jīng)引入了函數(shù)的概念:《永遠強大的函數(shù)》,之所以那時候就提到函數(shù),是因為我覺得函數(shù)之重要,遠遠超過一般。這里,重回函數(shù),一是復習,二是要在已經(jīng)...

    dmlllll 評論0 收藏0
  • [基礎python]畫圈還不簡單嗎?

    摘要:畫圈換一個說法就是循環(huán)。就相當于讓依次等于中的各個值。例找出以內的能夠被整除的正整數(shù)。以上做了簡單分析,要實現(xiàn)流程,還需要細化一下。代碼代碼運行結果這里僅僅列舉一個簡單的例子,看官可以在這個例子基礎上深入打印某范圍內的偶數(shù)奇數(shù)等。 畫圈?換一個說法就是循環(huán)。循環(huán),是高級語言編程中重要的工作?,F(xiàn)實生活中,很多事情都是在循環(huán),日月更迭,斗轉星移,無不是循環(huán);王朝更迭,尋常百姓,也都是循環(huán)。...

    ccj659 評論0 收藏0
  • [基礎python]編寫類之一創(chuàng)建實例

    摘要:接下來,一般都要編寫構造函數(shù),在寫這個函數(shù)之前,先解釋一下什么是構造函數(shù)。故這個函數(shù)稱為構造函數(shù),擔負著對類進行初始化的任務。 雖然已經(jīng)對類有了一點點模糊概念,但是,閱讀前面一講的內容的確感到累呀,都是文字,連代碼都沒有。 本講就要簡單多了,嘗試走一個類的流程。 說明:關于類的這部分,我參考了《Learning Python》一書的講解。 創(chuàng)建類 創(chuàng)建類的方法比較簡單,如下: ...

    mozillazg 評論0 收藏0
  • [基礎python]類的細節(jié)

    摘要:在對象接口后包裝其實現(xiàn)的細節(jié),從而隔離了代碼的修改對用戶產生的影響。類提供了一個新的本地作用域,最小化了變量名沖突。類其實并沒有結束,不過本講座到此對類暫告一段。 前面對類的有關內容已經(jīng)描述不少了,其實話題遠遠沒有結束,不過對于初學者,掌握這些已經(jīng)算是入門,在以后的實踐中,還需要進行體會和感悟。 這幾天和幾個朋友以各種途徑討論過OOP的相關問題,他們是:令狐蟲、Frank、晉劍、小馮...

    Fundebug 評論0 收藏0
  • [基礎python]一個免費的實驗室

    摘要:在學生時代,就羨慕實驗室,老師在里面可以鼓搗各種有意思的東西。再后來,終于發(fā)現(xiàn)原來計算機是一個最好的實驗室。通過實驗,研究清楚了,才能在編程實踐中使用。其實,這就是一個非常好的實驗室。 在學生時代,就羨慕實驗室,老師在里面可以鼓搗各種有意思的東西。上大學的時候,終于有機會在實驗室做大量實驗了,因為我是物理系,并且,遇到了一位非常令我尊敬的老師——高老師,讓我在他的實驗室里面,把所有已經(jīng)...

    soasme 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<