python函数教程:global 和 nonlocal的详细用法
global 方法
我們來(lái)看下面這段代碼:
b = 100 def func():b = b + 1return b print(func())這段代碼看上去中規(guī)中矩,似乎沒(méi)有什么問(wèn)題,但是程序運(yùn)行后確報(bào)錯(cuò)。
這是因?yàn)樵?Python 中,不允許直接在局部空間修改全局變量。b = b + 1 是一個(gè)沖突的語(yǔ)句:等式右邊的 b 是要調(diào)用一個(gè)全部變量,而等號(hào)右邊卻是要定義一個(gè)局部變量。
如果將 b 視作一個(gè)全局變量依然不合適。在函數(shù)中修改全局變量會(huì)對(duì)其他調(diào)用相同變量的函數(shù)造成影響,除非萬(wàn)不得已或者十分確定的情況下,不建議在函數(shù)中修改全局變量。
當(dāng)我們確定需要在函數(shù)中修改全局變量時(shí),可以通過(guò) global 方法來(lái)實(shí)現(xiàn):
b = 100 def func():global bb = b + 1return b print(func())輸出的結(jié)果為:
101如果 global 聲明的變量在全局空間中不存在,將會(huì)在全局空間中新建一個(gè)變量:
def func():global aa = 10a = a + 12print(a) func() print(a)輸出的結(jié)果為:
22 22nonlocal 方法
對(duì)于回環(huán)嵌套的函數(shù)來(lái)說(shuō),也會(huì)有類似的問(wèn)題。當(dāng)嘗試使用內(nèi)層函數(shù)修改外層函數(shù)的變量時(shí)會(huì)報(bào)錯(cuò):
a = 15 def func():a = 10def foo():a = a + 1foo()print(a) func() print(a)類似地,也不建議在內(nèi)層函數(shù)中修改外層函數(shù)的變量。如果一定要修改的話,可以使用 nonlocal 方法:
a = 15 def func():a = 10def foo():nonlocal aa = a + 1foo()print(a) func() print(a)輸出的結(jié)果為:
11 15nonlocal 方法只修改離它最近的一層函數(shù)的變量,如果這一層沒(méi)有就往上一層查找,只能在局部查找。另外,外層函數(shù)不能調(diào)用內(nèi)層函數(shù)的變量,即便用 nonlocal 方法也不行。如果外層所有函數(shù)中都沒(méi)有聲明的變量,即便全局空間中有也不行,而且 nonlocal 不能創(chuàng)建變量。如果找不到,就會(huì)報(bào)錯(cuò):
a = 15 def func():def foo():nonlocal aa = a + 1foo() func() print(a)其實(shí)想來(lái)這個(gè)設(shè)定也是合理的:如果外面套了很多層函數(shù),這個(gè)變量該在哪一層創(chuàng)建呢?
global 和 nonlocal方法總結(jié)
global 只修改全局空間中存在的變量
- 在局部空間中可以使用全局中的變量,但是不能修改。如果要強(qiáng)制修改,需要使用 global 聲明
- 當(dāng)變量在全局存在時(shí),global 就是聲明我要修改全局的變量
- 當(dāng)變量在全局中不存在時(shí),global 則是聲明要在全局創(chuàng)建一個(gè)變量
nonlocal 只修改局部空間中的變量,最多只能到達(dá)最外層函數(shù)
- 在內(nèi)層函數(shù)中可以使用外層函數(shù)中的變量,但是不能修改。如果要強(qiáng)制修改,需要使用 nonlocal 聲明
- 只修改離 nonlocal 最近的一層,如果這一層沒(méi)有就往上一層查找,不能找到全局中
- nonlocal 不能創(chuàng)建變量,如果其聲明的變量在外層函數(shù)中找不到,即便全局空間中有,也會(huì)報(bào)錯(cuò)
對(duì)函數(shù)的傳參有一點(diǎn)補(bǔ)充,傳參的時(shí)候相當(dāng)于在當(dāng)前函數(shù)體中進(jìn)行了賦值操作:
''' 學(xué)習(xí)中遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' def func(a):# 相當(dāng)于在func函數(shù)體中寫了這么一個(gè) a = 100 操作print(locals()) func(100)最后來(lái)一道思考題,請(qǐng)確定下列函數(shù)輸出的結(jié)果:
a = 10 def func():a = 5def foo():a = 3def f():nonlocal aa = a + 1def aa():a = 1def b():global aa = a + 1print(a)b()print(a)aa()print(a)f()print(a)foo()print(a) func() print(a)總結(jié)
以上是生活随笔為你收集整理的python函数教程:global 和 nonlocal的详细用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python函数的两种嵌套方法
- 下一篇: python教程:一篇文章让你理解字符串