教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢(xún)/投訴熱線:400-618-4000

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

更新時(shí)間:2022年10月21日15時(shí)05分 來(lái)源:傳智教育 瀏覽次數(shù):

  若在函數(shù)作用域中需要修改全局作用域或外層嵌套作用域中的變量,則需要使用global和nonlocal關(guān)鍵字。接下來(lái),分別對(duì)關(guān)鍵字global和nonlocal的作用進(jìn)行介紹。

  1.global關(guān)鍵字

  global關(guān)鍵字用于在函數(shù)作用域中修改全局變量。假設(shè)現(xiàn)在有一個(gè)test函數(shù),其外部定義了一個(gè)全局變量a,其內(nèi)部對(duì)全局變量a進(jìn)行重新賦值,示例代碼如下:

a = 100
def test():
    a += 100
    print(a)
test()
Traceback (most recent call last):
  File "<stdin>", line1, in <module>
  File "<stdin>", line2, in test
UnboundLocalError:local variable 'a' referenced before assignment

  上述程序報(bào)錯(cuò),提示“在賦值前引用了局部變量a”。但是,前面我們明明是可以在函數(shù)中訪問(wèn)全局變量的呀?而這里為什么會(huì)出錯(cuò)呢?

  這就是Python與其他語(yǔ)言的不同之處了。在Python中,如果在函數(shù)內(nèi)部對(duì)全局變量a進(jìn)行修改,Python會(huì)把變量a當(dāng)作是局部變量,而在進(jìn)行“a+=100”之前,我們是沒(méi)有聲明局部變量a的,因此,程序會(huì)出現(xiàn)上述錯(cuò)誤提示。

  要想在函數(shù)內(nèi)修改全局變量,我們可以在函數(shù)內(nèi)使用global關(guān)鍵字進(jìn)行聲明,下面,我們對(duì)程序進(jìn)行修改,示例代碼如下:

a = 100
def test():
    global a
    a += 100
    print(a)
test()
200

  這下,程序不但沒(méi)有報(bào)錯(cuò),而且成功對(duì)全局變量a進(jìn)行了修改。

  2.nonlocal關(guān)鍵字

  使用nonlocal關(guān)鍵字可以在函數(shù)作用域中修改嵌套作用域中的變量。下面,帶大家看一個(gè)例子:

def func():
    count = 1
    def func_in():
        count = 12
        func_in()
        print(count)
func()
1

  上述代碼定義了一個(gè)嵌套函數(shù),其中,func為外層函數(shù),func_in為內(nèi)層函數(shù)。func函數(shù)中定義了一個(gè)變量count,func_in函數(shù)中對(duì)變量count重新賦值,并在func函數(shù)中輸出count變量的值。由執(zhí)行結(jié)果可知,內(nèi)層函數(shù)func_in并沒(méi)有對(duì)外層函數(shù)func中的變量count進(jìn)行修改。而是重新定義了一個(gè)同名的變量count。若要修改外層函數(shù)func中的變量count,則需要在變量前使用nonlocal關(guān)鍵字,改后的示例代碼如下:

def func():
    count = 1
    def func_in():
        nonlocal count
        count = 12
    func_in()
    print(count)
func()
12

  由執(zhí)行結(jié)果可知,內(nèi)層函數(shù)成功修改了變量的值。

注意:

  使用global關(guān)鍵字修飾的變量之前可以不存在,而使用nonlocal關(guān)鍵字修飾的變量在嵌套作用域中必須已經(jīng)存在。

0 分享到:
和我們?cè)诰€交談!