global与nonlocal关键字
? ? ? ? 在Python中,當引用一個變量的時候,對這個變量的搜索是按找本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、內置作用域(builtins模塊)的順序來進行的,即所謂的LEGB規則。?
然而當在一個函數內部為一個變量賦值時,并不是按照上面所說LEGB規則來首先找到變量,之后為該變量賦值。在Python中,在函數中為一個變量賦值時,有下面這樣一條規則:
“當在函數中給一個變量名賦值是(而不是在一個表達式中對其進行引用),Python總是創建或改變本地作用域的變量名,除非它已經在那個函數中被聲明為全局變量. ”global適用于函數內部修改全局變量的值
nonlocal適用于嵌套函數中內部函數修改外部變量的值
舉例說明:
x = 1 def f1():x = 2 f1() print(x) #輸出 1在上面的程序當中先定義了一個全局變量x=1,也就是說現在全局名稱空間現在有了一個x=1,接下來在f1函數當中又給x賦值為2,但是因為在f1函數當中沒有變量x,所以python會在f1函數這個本地作用域創建一個變量x,也就是說這個x只存在于本地作用域,并非是全局變量中的那個x。而后運行程序打印的那個x會優先找到全局變量中的x,所以最后會輸出1。
如果想在函數內部修改全局變量x,就需要用到global關鍵字:
x = 1 def f1():global xx = 2 f1() print(x) #輸出 2使用global關鍵字就是在告訴python,我們要在局部作用域使用全局變量,所以在x=2語句當中,python不會再在本地作用域中再新建一個變量,而是直接使用全局變量中的x變量
?
nonlocal關鍵字的作用與global類似,舉例:
def f1():a = 250def f2():a = 520f2()print(a) f1() # 輸出 250在這個程序當中,在嵌套的f2函數當中,對變量a的賦值,同樣因為在本地作用域中沒有x,python會在f2函數的內存空間在創建一個新的變量a,如果想要修改嵌套作用域中的a,就要使用關鍵字nonlocal
def f1():a = 250def f2():nonlocal aa = 520f2()print(a) f1() # 輸出 520使用了nonlocal關鍵字就是告訴python,我們要在f2函數中使用外部變量a,所以我們在f2函數內對a變量進行賦值時就使用的是外部變量a,而不是重新創建出來的變量
注意:使用global關鍵字修飾的變量之前可以并不存在,而使用nonlocal關鍵字修飾的變量在嵌套作用域中必須已經存在,否則會報錯。
?
轉載于:https://www.cnblogs.com/Yang-Sen/p/9135582.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的global与nonlocal关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Struts2漏洞和Struts Sca
- 下一篇: 一行代码,保障分布式事务一致性—GTS: