前言
終于下定決心學習Python了。既然從頭開始,就需要認認真真。
首先需要說的是,我是初學Python,這篇文章只是用于展示global和nonlocal關鍵字的區別,是很簡單的知識點,如果你已經學過,可以繞道。因為不經常寫博客,而且是個Python小白,所以內容有些啰嗦。。。
兩個關鍵詞都用于允許在一個局部作用域中使用外層的變量。
global 表示將變量聲明為全局變量 nonlocal 表示將變量聲明為外層變量(外層函數的局部變量,而且不能是全局變量)注意:我使用的是Python3.6.3,可能和Python2有不同的地方,并未確認。
考慮到文章比較啰嗦,先把結論貼出來,避免浪費大家的時間:
第一,兩者的功能不同。global關鍵字修飾變量后標識該變量是全局變量,對該變量進行修改就是修改全局變量,而nonlocal關鍵字修飾變量后標識該變量是上一級函數中的局部變量,如果上一級函數中不存在該局部變量,nonlocal位置會發生錯誤(最上層的函數使用nonlocal修飾變量必定會報錯)。
第二,兩者使用的范圍不同。global關鍵字可以用在任何地方,包括最上層函數中和嵌套函數中,即使之前未定義該變量,global修飾后也可以直接使用,而nonlocal關鍵字只能用于嵌套函數中,并且外層函數中定義了相應的局部變量,否則會發生錯誤(見第一)。
接下來是得到結論的過程,有興趣的可以瀏覽一下。
我們先來看一個代碼片段,看看默認情況下輸出結果是什么(不敢恭維CSDN顯示代碼的格式,這里使用圖片,如果要驗證,得麻煩各位動動指頭了)。
輸出結果:
上面的代碼片段中沒有使用global或nonlocal關鍵字,是為了看一下默認情況下的輸出結果。
可以看到變量x在三次輸出中是同一個變量(值相同,地址也相同),都是全局變量,在print函數中使用三個參數是為了方便識別變量,第一個參數是print運行的位置,第二個參數是變量x保存的值,第三個參數是變量x保存的值的地址(這個有待考證)。
如果我們在func函數中修改x的值呢?
輸出結果:
可以看到func函數中x的值和地址都變了,但沒有影響函數外邊的x的值和地址(main1和main2的數據相同)。所以func函數內的x變量和函數外的x變量是兩個變量,而func內的x變量是局部變量,修改它的值不影響全局變量。
新聞熱點
疑難解答