python中的關鍵字global和nonlocal

來源:互聯網
上載者:User

標籤:lin   pre   glob   error   oba   本地   module   mod   style   

知識點:

global將一個變數變為全域變數

nonlocal改變最近的變數,又不是全域作用。

 

1.global

在python中,當引用一個變數的時候,對這個變數的搜尋按找本地範圍(Local)、嵌套範圍(Encolosing function locals)、全域範圍(Global)、內建範圍(builtins模組)的順序來進行的,即所謂的LEGB規則。

m = 1    #全域def fun1():    m = 2    #嵌套    def fun2():        m = 3    #本地    fun2()fun1()

當在函數中給一個變數賦值的時候,python總是建立或者改變本地範圍的變數名,因此你無法在一個函數外調用函數內的變數,也無法在函數內改變一個函數外的變數。就像下面

#外層無法引用內層變數def fun1():    k = 10fun1()print(k)結果:Traceback (most recent call last):  File "I:/untitled/cx/11月/11-17物件導向/1.屬性.py", line 83, in <module>    print(k)NameError: name ‘k‘ is not defined#記憶體無法改變外層變數k = 100def fun1():    k = k + 50fun1()print(k)#結果Traceback (most recent call last):...UnboundLocalError: local variable ‘k‘ referenced before assignment

如果在函數中改變函數外的變數或者在函數外調用函數內的變數時,可以使用global。

global可以將一個變數變為全域變數。在內部改變或者在外部參考。

def fun1():    global k    k = 50fun1()print(k)或者這樣k = 10def fun1():    global k    k = 50fun1()print(k)

 

 

2.nonlocal

nonlocal可以在一個嵌套的函數中修改嵌套範圍中的變數,理論上是修改離它最近的變數,但不會改變全域。

#這是正常情況def func3():    n = 1    def func4():        n = 2              def func5():            n = 5            print(n) #5           func5()        print(n)   #2    func4()    print(n)   #1func3()

加入nonlocal之後

def func3():    n = 1    def func4():        n = 2       #最近的n = 5        def func5():            nonlocal n            n = 5            print(n) #5        func5()        print(n)   #5    func4()    print(n)   #1func3()

還可能這樣:

def func3():     n = 1  #這裡最近n =5    def func4():        # n = 2               def func5():            nonlocal n            n = 5            print(n) #5        func5()        print(n)   #5   繼承func3    func4()    print(n)   #5func3()

不會改變全域

n =100def func3():    n = 1  #這裡最近n =5    def func4():        def func5():            nonlocal n            n = 5            print(n) #5        func5()        print(n)   #5   繼承func3    func4()    print(n)   #5func3()#結果555100

 

python中的關鍵字global和nonlocal

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.