global 办法
咱们来看上面这段代码:
b = 100
def func():
b = b + 1
return b
print(func())
这段代码看上去中规中矩,仿佛没有什么问题,然而程序运行后确报错。
这是因为在 Python 中,不容许间接在部分空间批改全局变量。b = b + 1 是一个抵触的语句:等式左边的 b 是要调用一个全副变量,而等号左边却是要定义一个局部变量。
如果将 b 视作一个全局变量仍然不适合。在函数中批改全局变量会对其余调用雷同变量的函数造成影响,除非万不得已或者非常确定的状况下,不倡议在函数中批改全局变量。
当咱们确定须要在函数中批改全局变量时,能够通过 global 办法来实现:
b = 100
def func():
global b
b = b + 1
return b
print(func())
输入的后果为:
101
如果 global 申明的变量在全局空间中不存在,将会在全局空间中新建一个变量:
def func():
global a
a = 10
a = a + 12
print(a)
func()
print(a)
输入的后果为:
22
22
nonlocal 办法
对于回环嵌套的函数来说,也会有相似的问题。当尝试应用内层函数批改外层函数的变量时会报错:
a = 15
def func():
a = 10
def foo():
a = a + 1
foo()
print(a)
func()
print(a)
相似地,也不倡议在内层函数中批改外层函数的变量。如果肯定要批改的话,能够应用 nonlocal 办法:
a = 15
def func():
a = 10
def foo():
nonlocal a
a = a + 1
foo()
print(a)
func()
print(a)
输入的后果为:
11
15
nonlocal 办法只批改离它最近的一层函数的变量,如果这一层没有就往上一层查找,只能在部分查找。另外,外层函数不能调用内层函数的变量,即使用 nonlocal 办法也不行。如果外层所有函数中都没有申明的变量,即使全局空间中有也不行,而且 nonlocal 不能创立变量。如果找不到,就会报错:
a = 15
def func():
def foo():
nonlocal a
a = a + 1
foo()
func()
print(a)
其实想来这个设定也是正当的:如果里面套了很多层函数,这个变量该在哪一层创立呢?
global 和 nonlocal 办法总结
global 只批改全局空间中存在的变量
在部分空间中能够应用全局中的变量,然而不能批改。如果要强制批改,须要应用 global 申明
当变量在全局存在时,global 就是申明我要批改全局的变量
当变量在全局中不存在时,global 则是申明要在全局创立一个变量
nonlocal 只批改部分空间中的变量,最多只能达到最外层函数
在内层函数中能够应用外层函数中的变量,然而不能批改。如果要强制批改,须要应用 nonlocal 申明
只批改离 nonlocal 最近的一层,如果这一层没有就往上一层查找,不能找到全局中
nonlocal 不能创立变量,如果其申明的变量在外层函数中找不到,即使全局空间中有,也会报错
对函数的传参有一点补充,传参的时候相当于在以后函数体中进行了赋值操作:
def func(a):
# 相当于在 func 函数体中写了这么一个 a = 100 操作
print(locals())
func(100)
最初来一道思考题,请确定下列函数输入的后果:
a = 10
def func():
a = 5
def foo():
a = 3
def f():
nonlocal a
a = a + 1
def aa():
a = 1
def b():
global a
a = a + 1
print(a)
b()
print(a)
aa()
print(a)
f()
print(a)
foo()
print(a)
func()
print(a)
以上就是本次分享的全部内容,当初想要学习编程的小伙伴欢送关注 Python 技术大本营,获取更多技能与教程。