淺析Python中g(shù)lobal和nonlocal關(guān)鍵字的妙用
在 Python 中編寫函數(shù)時(shí),經(jīng)常會(huì)遇到需要在函數(shù)內(nèi)部訪問和修改外部變量的情況。在這種情況下,我們可以使用 global 和 nonlocal 關(guān)鍵字來聲明變量的作用域,以便正確地訪問和修改這些變量。本文將深入探討 global 和 nonlocal 的用法,包括詳細(xì)的示例代碼和實(shí)際應(yīng)用場(chǎng)景。
global 關(guān)鍵字
在 Python 中,global 關(guān)鍵字用于在函數(shù)內(nèi)部聲明全局變量。當(dāng)在函數(shù)內(nèi)部使用一個(gè)變量,并且希望該變量在函數(shù)外部也可見和修改時(shí),就需要使用 global 關(guān)鍵字。
示例代碼:
x = 10 def increment_global(): global x x += 1 print("函數(shù)內(nèi)部 x 的值:", x) increment_global() print("函數(shù)外部 x 的值:", x)
在上面的示例中,使用 global 關(guān)鍵字聲明了變量 x 是全局變量,因此在 increment_global 函數(shù)內(nèi)部可以對(duì)其進(jìn)行修改。
nonlocal 關(guān)鍵字
與 global 關(guān)鍵字不同,nonlocal 關(guān)鍵字用于在嵌套函數(shù)中聲明外部嵌套作用域中的變量。當(dāng)在一個(gè)函數(shù)內(nèi)部定義了另一個(gè)函數(shù),并且希望內(nèi)部函數(shù)可以訪問外部函數(shù)的變量時(shí),就需要使用 nonlocal 關(guān)鍵字。
示例代碼:
def outer_function(): y = 20 def inner_function(): nonlocal y y += 1 print("內(nèi)部函數(shù) y 的值:", y) inner_function() print("外部函數(shù) y 的值:", y) outer_function()
在上面的示例中,使用 nonlocal 關(guān)鍵字聲明了變量 y 是外部函數(shù) outer_function 中的變量,因此在 inner_function 內(nèi)部可以對(duì)其進(jìn)行修改。
實(shí)際應(yīng)用場(chǎng)景
1. 在函數(shù)內(nèi)部修改全局變量
有時(shí)候需要在函數(shù)內(nèi)部修改全局變量,例如計(jì)數(shù)器等應(yīng)用場(chǎng)景。
count = 0 def increment_counter(): global count count += 1 print("當(dāng)前計(jì)數(shù)器值:", count) increment_counter() increment_counter()
2. 在嵌套函數(shù)中訪問外部函數(shù)的變量
當(dāng)在一個(gè)函數(shù)內(nèi)部定義了另一個(gè)函數(shù),并且需要內(nèi)部函數(shù)訪問外部函數(shù)的變量時(shí),可以使用 nonlocal 關(guān)鍵字。
def outer_function(): result = 0 def inner_function(): nonlocal result result += 10 print("內(nèi)部函數(shù)計(jì)算結(jié)果:", result) inner_function() print("外部函數(shù)計(jì)算結(jié)果:", result) outer_function()
3. 在閉包中使用外部變量
閉包是一種特殊的函數(shù),可以訪問其外部作用域中定義的變量。使用 nonlocal 關(guān)鍵字可以在閉包中修改外部變量的值。
def outer(): x = 10 def inner(): nonlocal x x += 5 return x return inner closure = outer() print("閉包中的值:", closure())
示例代碼
1. 使用 global 關(guān)鍵字管理全局變量
global_var = 100 def modify_global(): global global_var global_var += 50 modify_global() print("修改后的全局變量值:", global_var)
上述代碼中,聲明了一個(gè)全局變量 global_var,然后在函數(shù)內(nèi)部使用 global 關(guān)鍵字來修改它的值,從而實(shí)現(xiàn)對(duì)全局變量的管理。
2. 使用 nonlocal 關(guān)鍵字訪問外部函數(shù)的變量
def outer_function(): outer_var = 10 def inner_function(): nonlocal outer_var outer_var += 5 print("內(nèi)部函數(shù)中的外部變量值:", outer_var) inner_function() print("外部函數(shù)中的外部變量值:", outer_var) outer_function()
在這個(gè)示例中,定義了一個(gè)外部函數(shù) outer_function,其中包含一個(gè)變量 outer_var。在內(nèi)部函數(shù) inner_function 中,使用 nonlocal 關(guān)鍵字訪問并修改了外部函數(shù)中的變量 outer_var,并打印了修改后的值。
3. 使用 global 和 nonlocal 關(guān)鍵字的組合
global_var = 100 def outer_function(): nonlocal_var = 50 def inner_function(): global global_var nonlocal nonlocal_var global_var += 10 nonlocal_var += 20 print("全局變量值:", global_var) print("外部函數(shù)中的非局部變量值:", nonlocal_var) inner_function() print("全局變量值(外部函數(shù)中修改后):", global_var) print("外部函數(shù)中的非局部變量值(外部函數(shù)中修改后):", nonlocal_var) outer_function()
這個(gè)示例演示了在嵌套函數(shù)中同時(shí)使用 global 和 nonlocal 關(guān)鍵字的情況。在內(nèi)部函數(shù) inner_function 中修改了全局變量 global_var 和外部函數(shù)中的非局部變量 nonlocal_var,并打印了它們的值。同時(shí),在外部函數(shù)中也打印了這些變量的修改后的值。
總結(jié)
Python 中的 global 和 nonlocal 關(guān)鍵字在變量作用域和值傳遞方面發(fā)揮著重要作用。global 關(guān)鍵字用于在函數(shù)內(nèi)部聲明全局變量,使得函數(shù)內(nèi)部可以訪問和修改全局變量的值。而 nonlocal 關(guān)鍵字則用于在嵌套函數(shù)中聲明外部嵌套作用域中的變量,使得內(nèi)部函數(shù)可以訪問和修改外部函數(shù)中的變量。
到此這篇關(guān)于淺析Python中g(shù)lobal和nonlocal關(guān)鍵字的妙用的文章就介紹到這了,更多相關(guān)Python global nonlocal內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)byte轉(zhuǎn)integer
這篇文章主要介紹了Python實(shí)現(xiàn)byte轉(zhuǎn)integer操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06python中的np.argmax() 返回最大值索引號(hào)
這篇文章主要介紹了python中的np.argmax() 返回最大值索引號(hào)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06OPENAI?API?微調(diào)?GPT-3?的?Ada?模型
這篇文章主要為大家介紹了OPENAI?API?微調(diào)?GPT-3?的?Ada?模型使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Python實(shí)現(xiàn)帶GUI界面的手寫數(shù)字識(shí)別
這篇文章主要介紹了如何通過Python實(shí)現(xiàn)帶GUI界面的手寫數(shù)字識(shí)別,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下2022-01-01Python中splitlines()方法的使用簡(jiǎn)介
這篇文章主要介紹了Python中splitlines()方法的使用簡(jiǎn)介,是Python入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05Python3如何將源目錄中的圖片用MD5命名并可以設(shè)定目標(biāo)目錄
這篇文章主要介紹了Python3如何將源目錄中的圖片用MD5命名并可以設(shè)定目標(biāo)目錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02padas 生成excel 增加sheet表的實(shí)例
今天小編就為大家分享一篇padas 生成excel 增加sheet表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12配置 Pycharm 默認(rèn) Test runner 的圖文教程
今天小編就為大家分享一篇配置 Pycharm 默認(rèn) Test runner 的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11