global 和 nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

def fun():  
    global num1  
    num1=2  
    print("函数内修改后num1=",num1)  
num1=1  
print("初始num1=",num1)  
fun()  
print("运行完函数后num1=",num1)  

运行结果:

初始num1= 1
函数内修改后num1= 2
运行完函数后num1= 2

使用global关键字就是告诉python编译器这个变量不是局部变量而是全局变量,其实有点像是"引用"的意思

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:

#!/usr/bin/python3
 
def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

以上实例输出结果:

100
100

另外有一种特殊情况,假设下面这段代码被运行:
#!/usr/bin/python3
 
a = 10
def test():
    a = a + 1
    print(a)
test()

以上程序执行,报错信息如下:

D:softwarePython36python.exe F:/pythonProjects/leetcode/Test.py
Traceback (most recent call last):
  File "F:/pythonProjects/leetcode/Test.py", line 7, in <module>
    test()
  File "F:/pythonProjects/leetcode/Test.py", line 3, in test
    a = a + 1
UnboundLocalError: local variable 'a' referenced before assignment

错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。

修改 a 为全局变量,通过函数参数传递,可以正常执行输出结果为:

#!/usr/bin/python3
 
a = 10
def test(a):
    a = a + 1
    print(a)
test(a)

执行输出结果为:

11

原文地址:https://www.cnblogs.com/whu-2017/p/9237644.html