乐趣区

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

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 技术大本营,获取更多技能与教程。

退出移动版