欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

跟老齊學(xué)Python之深入變量和引用對(duì)象

 更新時(shí)間:2014年09月24日 11:40:30   投稿:hebedich  
本講再次提及變量和引用對(duì)象,就是要讓看官對(duì)變量和賦值有一個(gè)知其然和知其所以然的認(rèn)識(shí)。當(dāng)然,最后能不能達(dá)到此目的,主要看我是不是說(shuō)的通俗易懂了。如果您沒(méi)有明白,就說(shuō)明我說(shuō)的還不夠好,可以聯(lián)系我,我再為您效勞。

在《永遠(yuǎn)強(qiáng)大的函數(shù)》那一講中,老齊我已經(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è)變量賦值。

所以,像這樣是不行的。

復(fù)制代碼 代碼如下:

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

 反復(fù)提醒:一定要注意看報(bào)錯(cuò)信息。如果光光地寫(xiě)一個(gè)變量,而沒(méi)有賦值,那么python認(rèn)為這個(gè)變量沒(méi)有定義。賦值,不僅僅是給一個(gè)非空的值,也可以給一個(gè)空值,如下,都是允許的

復(fù)制代碼 代碼如下:

>>> 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ì)不能腳踩兩只船。如果這樣呢?

復(fù)制代碼 代碼如下:

>>> 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

復(fù)制代碼 代碼如下:

>>> a = 100         #完成了變量a對(duì)內(nèi)存空間中的對(duì)象100的引用

 如下圖所示:

然后,又操作了:

復(fù)制代碼 代碼如下:

>>> 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ò)程的原理搞清楚了,下面就可以深入一步了。

復(fù)制代碼 代碼如下:

>>> 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)了。

復(fù)制代碼 代碼如下:

>>> l1[0] = 99      #把對(duì)象變?yōu)閇99,2,3]
>>> l1              #變了
[99, 2, 3]
>>> l2             #真的變了吔
[99, 2, 3]

 再換一個(gè)方式:

復(fù)制代碼 代碼如下:

>>> 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):

復(fù)制代碼 代碼如下:

>>> 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),就曉得了。比如:

復(fù)制代碼 代碼如下:

>>> 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í)候

復(fù)制代碼 代碼如下:

>>> 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ò),還可以再深入一些。走著瞧吧。

相關(guān)文章

  • Python中的sorted函數(shù)應(yīng)用及文件操作詳解

    Python中的sorted函數(shù)應(yīng)用及文件操作詳解

    這篇文章主要介紹了Python中的sorted函數(shù)應(yīng)用及文件操作詳解,python只能將字符串寫(xiě)入到文本文件,要將數(shù)值數(shù)據(jù)存儲(chǔ)到文本本件中,必須先試用函數(shù)str()將其轉(zhuǎn)換為字符串格式,需要的朋友可以參考下
    2023-12-12
  • python爬蟲(chóng)爬取監(jiān)控教務(wù)系統(tǒng)的思路詳解

    python爬蟲(chóng)爬取監(jiān)控教務(wù)系統(tǒng)的思路詳解

    這篇文章主要介紹了python爬蟲(chóng)監(jiān)控教務(wù)系統(tǒng),主要實(shí)現(xiàn)思路是對(duì)已有的成績(jī)進(jìn)行處理,變?yōu)閘ist集合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-01-01
  • python 將md5轉(zhuǎn)為16字節(jié)的方法

    python 將md5轉(zhuǎn)為16字節(jié)的方法

    今天小編就為大家分享一篇python 將md5轉(zhuǎn)為16字節(jié)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python3中的函數(shù)與參數(shù)及空值問(wèn)題

    python3中的函數(shù)與參數(shù)及空值問(wèn)題

    這篇文章主要介紹了python3-函數(shù)與參數(shù)以及空值,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • Python3中的f-Strings增強(qiáng)版字符串格式化方法

    Python3中的f-Strings增強(qiáng)版字符串格式化方法

    這篇文章主要介紹了Python3中的f-Strings增強(qiáng)版字符串格式化方法,看完本文你將學(xué)習(xí)到如何以及為什么使用f-strings。對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • pyinstaller執(zhí)行報(bào)錯(cuò)的問(wèn)題解決

    pyinstaller執(zhí)行報(bào)錯(cuò)的問(wèn)題解決

    有時(shí)候,PyInstaller可能無(wú)法正確識(shí)別和打包所有的依賴項(xiàng),導(dǎo)致名稱錯(cuò)誤,本文主要介紹了pyinstaller執(zhí)行報(bào)錯(cuò)的解決方案,感興趣的可以了解一下
    2023-11-11
  • Python使用MD5加密字符串示例

    Python使用MD5加密字符串示例

    這篇文章主要介紹了Python使用MD5加密字符串示例,對(duì)一些可能出現(xiàn)的錯(cuò)誤點(diǎn)上本文也給出提醒,需要的朋友可以參考下
    2014-08-08
  • 帶你了解Python語(yǔ)言的神奇世界

    帶你了解Python語(yǔ)言的神奇世界

    大家好,本篇文章主要講的是帶你了解Python語(yǔ)言的神奇世界,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • python_array[0][0]與array[0,0]的區(qū)別詳解

    python_array[0][0]與array[0,0]的區(qū)別詳解

    今天小編就為大家分享一篇python_array[0][0]與array[0,0]的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python深拷貝與淺拷貝引用

    Python深拷貝與淺拷貝引用

    這篇文章主要介紹了Python深拷貝與淺拷貝引用,Python并沒(méi)有拷貝這個(gè)對(duì)象,而只是拷貝了這個(gè)對(duì)象的引用,下文具體的相關(guān)介紹需要的小伙伴可以參考一下
    2022-04-04

最新評(píng)論