亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中關(guān)鍵字global和nonlocal的區(qū)別詳解

 更新時間:2018年09月03日 08:39:04   作者:一笑1990  
這篇文章主要給大家介紹了關(guān)于Python中關(guān)鍵字global和nonlocal的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

終于下定決心學(xué)習(xí)Python了。既然從頭開始,就需要認(rèn)認(rèn)真真。

首先需要說的是,我是初學(xué)Python,這篇文章只是用于展示global和nonlocal關(guān)鍵字的區(qū)別,是很簡單的知識點,如果你已經(jīng)學(xué)過,可以繞道。因為不經(jīng)常寫博客,而且是個Python小白,所以內(nèi)容有些啰嗦。。。

兩個關(guān)鍵詞都用于允許在一個局部作用域中使用外層的變量。

  • global 表示將變量聲明為全局變量
  • nonlocal 表示將變量聲明為外層變量(外層函數(shù)的局部變量,而且不能是全局變量)

注意:我使用的是Python3.6.3,可能和Python2有不同的地方,并未確認(rèn)。

考慮到文章比較啰嗦,先把結(jié)論貼出來,避免浪費大家的時間:

第一,兩者的功能不同。global關(guān)鍵字修飾變量后標(biāo)識該變量是全局變量,對該變量進(jìn)行修改就是修改全局變量,而nonlocal關(guān)鍵字修飾變量后標(biāo)識該變量是上一級函數(shù)中的局部變量,如果上一級函數(shù)中不存在該局部變量,nonlocal位置會發(fā)生錯誤(最上層的函數(shù)使用nonlocal修飾變量必定會報錯)。

第二,兩者使用的范圍不同。global關(guān)鍵字可以用在任何地方,包括最上層函數(shù)中和嵌套函數(shù)中,即使之前未定義該變量,global修飾后也可以直接使用,而nonlocal關(guān)鍵字只能用于嵌套函數(shù)中,并且外層函數(shù)中定義了相應(yīng)的局部變量,否則會發(fā)生錯誤(見第一)。

接下來是得到結(jié)論的過程,有興趣的可以瀏覽一下。

我們先來看一個代碼片段,看看默認(rèn)情況下輸出結(jié)果是什么(不敢恭維CSDN顯示代碼的格式,這里使用圖片,如果要驗證,得麻煩各位動動指頭了)。

輸出結(jié)果:

上面的代碼片段中沒有使用global或nonlocal關(guān)鍵字,是為了看一下默認(rèn)情況下的輸出結(jié)果。

可以看到變量x在三次輸出中是同一個變量(值相同,地址也相同),都是全局變量,在print函數(shù)中使用三個參數(shù)是為了方便識別變量,第一個參數(shù)是print運行的位置,第二個參數(shù)是變量x保存的值,第三個參數(shù)是變量x保存的值的地址(這個有待考證)。

如果我們在func函數(shù)中修改x的值呢?

輸出結(jié)果:

可以看到func函數(shù)中x的值和地址都變了,但沒有影響函數(shù)外邊的x的值和地址(main1和main2的數(shù)據(jù)相同)。所以func函數(shù)內(nèi)的x變量和函數(shù)外的x變量是兩個變量,而func內(nèi)的x變量是局部變量,修改它的值不影響全局變量。

第一回合:在函數(shù)內(nèi)部使用了與全局變量同名的變量,如果不對該變量賦值(修改變量),那么該變量就是全局變量,如果對該變量進(jìn)行賦值,那么該變量就是局部變量。

如果我們想在func函數(shù)內(nèi)修改全局變量x呢?我們先試試用global(全局)。

運行后報錯,提示語法錯誤。原來global修飾變量時不能直接賦值,修改為如下:

運行結(jié)果:

可以看到main1位置的x和func內(nèi)部func1位置的x是同一個值,但和func內(nèi)部的func2以及main2位置的x不一樣了,反而是main2處的x和func內(nèi)部的x變量是同一個。

第二回合:global關(guān)鍵字修飾函數(shù)內(nèi)部變量后標(biāo)志其是全局變量(這里不能說global將x從局部變量改為了全局變量),如果用global修飾函數(shù)內(nèi)的變量,必須在使用該變量前進(jìn)行修飾(否則會發(fā)生變量未定義的錯誤,請你自己嘗試一下)。

我們試試nonlocal關(guān)鍵字呢?

報錯了,無法使用nonlocal關(guān)鍵字。

接下來我們看看怎樣使用nonlocal關(guān)鍵字。

我們先添加一個嵌套函數(shù):

輸出結(jié)果:

可以看到嵌套函數(shù)內(nèi)默認(rèn)使用的也是全局變量。我們在func函數(shù)中修改一下x的值試試。

輸出結(jié)果:

可以看到在func函數(shù)中修改x后,x被標(biāo)識成局部變量,它的改變并沒有影響全局變量x,但嵌套函數(shù)ifunc中的x受到了影響,顯示ifunc中的x是func函數(shù)中的局部變量。

我們再繼續(xù)修改一下ifunc中x的值。

輸出結(jié)果:

可以看到在ifunc修改x的之后即沒有影響func中的局部變量x,也沒有影響全局變量x,ifunc中的x是函數(shù)ifunc自己的局部變量。

第三回合:如果在嵌套函數(shù)和函數(shù)(這里指包含嵌套函數(shù)的那個函數(shù))中存在和全局變量同名的變量,如果直接使用,而不修改變量的值,那么這三個位置的變量使用的是同一個全局變量,如果在函數(shù)中修改了變量值,那么該變量會被標(biāo)識為該函數(shù)的局部變量,嵌套函數(shù)直接使用時使用的是該函數(shù)的局部變量。如果在嵌套函數(shù)中修改同名變量的值,那么嵌套函數(shù)中的該變量會被標(biāo)識為該嵌套函數(shù)的局部變量,它的修改不影響函數(shù)中同名變量和全局變量。

我們在嵌套函數(shù)中添加global關(guān)鍵字試試。

先不修改ifunc中x的值:

輸出結(jié)果:

可以看出嵌套函數(shù)ifunc中的x是全局變量。

再修改一下ifunc中x的值試試:

輸出結(jié)果:

可以看出嵌套函數(shù)中x是全局變量,但它的修改沒有影響到func函數(shù)中的同名局部變量。

我們在前邊已經(jīng)發(fā)現(xiàn)在func函數(shù)中直接使用nonlocal關(guān)鍵字發(fā)生了報錯,我們再試試在ifunc中使用nonlocal關(guān)鍵字:

輸出結(jié)果:

可以看到nonlocal修飾后,ifunc中的x和func中的x是同一個變量,ifunc中修改x的值影響了func中的x(因為是一個變量),但并沒有影響全局變量x。

再擴(kuò)展一下:

在func函數(shù)中用global修飾x并修改ifunc中x的值,看看有什么變化:

輸出結(jié)果:

我們再用nonlocal修飾一下ifunc函數(shù)中的x:

運行時發(fā)生報錯,提示沒有為ifunc中的x找到綁定。

第四回合:global可以在任何地方修飾變量,而且被global修飾的變量直接被標(biāo)識為全局變量,對該變量修改會影響全局變量的值,但不影響函數(shù)中未被global修飾的同名變量(依然是局部變量),nonlocal只能在嵌套函數(shù)(可能還有其他的地方,我還沒有檢查)中使用,用于標(biāo)識嵌套函數(shù)中的變量是包含該嵌套函數(shù)的函數(shù)中的同名變量,在嵌套函數(shù)中修改變量會影響函數(shù)中的變量。如果在函數(shù)中使用global修飾了變量,那么在嵌套函數(shù)中用nonlocal修飾同名變量會發(fā)生報錯,因為nonlocal表示該變量在函數(shù)中已經(jīng)定義,但檢查時因為同名變量被global修飾為全局變量,所以不存在同名的局部變量,從而導(dǎo)致錯誤。

總結(jié):

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 控制Python浮點數(shù)輸出位數(shù)的操作方法

    控制Python浮點數(shù)輸出位數(shù)的操作方法

    在python的輸出結(jié)果中,尤其是浮點數(shù)的輸出,當(dāng)我們需要寫入文本文件時,最好是采用統(tǒng)一的輸出格式,這樣也能夠增強(qiáng)結(jié)果的可讀性,這篇文章主要介紹了控制Python浮點數(shù)輸出位數(shù)的方法,需要的朋友可以參考下
    2022-04-04
  • Python實例方法、類方法、靜態(tài)方法區(qū)別詳解

    Python實例方法、類方法、靜態(tài)方法區(qū)別詳解

    這篇文章主要介紹了Python實例方法、類方法、靜態(tài)方法區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Python中的defaultdict與__missing__()使用介紹

    Python中的defaultdict與__missing__()使用介紹

    下面這篇文章主要給大家介紹了關(guān)于Python中defaultdict使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • Django學(xué)習(xí)筆記之ORM基礎(chǔ)教程

    Django學(xué)習(xí)筆記之ORM基礎(chǔ)教程

    ORM,即Object-Relational Mapping(對象關(guān)系映射),它的作用是在關(guān)系型數(shù)據(jù)庫和業(yè)務(wù)實體對象之間作一個映射,下面這篇文章主要給大家介紹了關(guān)于Django學(xué)習(xí)筆記之ORM基礎(chǔ)教程的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-03-03
  • Python中Celery異步任務(wù)隊列的具體使用

    Python中Celery異步任務(wù)隊列的具體使用

    Celery是一個用于處理分布式任務(wù)和作業(yè)隊列的異步任務(wù)隊列庫,本文主要介紹了Python中Celery異步任務(wù)隊列的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Python下線程之間的共享和釋放示例

    Python下線程之間的共享和釋放示例

    這篇文章主要用示例簡單介紹了Python下線程之間的共享和釋放,線程一直是Python開發(fā)者中的熱點問題,需要的朋友可以參考下
    2015-05-05
  • Python的批量遠(yuǎn)程管理和部署工具Fabric用法實例

    Python的批量遠(yuǎn)程管理和部署工具Fabric用法實例

    這篇文章主要介紹了Python的批量遠(yuǎn)程管理和部署工具Fabric用法,實例分析了Fabric的功能與具體使用方法,需要的朋友可以參考下
    2015-01-01
  • python 巧用正則尋找字符串中的特定字符的位置方法

    python 巧用正則尋找字符串中的特定字符的位置方法

    下面小編就為大家分享一篇python 巧用正則尋找字符串中的特定字符的位置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • anaconda升級sklearn版本的實現(xiàn)方法

    anaconda升級sklearn版本的實現(xiàn)方法

    這篇文章主要介紹了anaconda升級sklearn版本的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python?imgaug庫安裝與使用教程(圖片加模糊光雨雪霧等特效)

    Python?imgaug庫安裝與使用教程(圖片加模糊光雨雪霧等特效)

    imgaug機(jī)器學(xué)習(xí)實驗中的圖像增強(qiáng)庫,特別是卷積神經(jīng)網(wǎng)絡(luò),支持以多種不同方式增強(qiáng)圖像、關(guān)鍵點/地標(biāo)、邊界框、熱圖和分割圖,這篇文章主要介紹了Python?imgaug庫?安裝與使用教程(圖片加模糊光雨雪霧等特效),需要的朋友可以參考下
    2022-11-11

最新評論