日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python函数教程:global 和 nonlocal的详细用法

發(fā)布時(shí)間:2025/3/20 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python函数教程:global 和 nonlocal的详细用法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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 22

nonlocal 方法

對(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 15

nonlocal 方法只修改離它最近的一層函數(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。