局部变量修改全局变量

在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,

若要在函数内修改全局名称空间中名字的值,

当值为不可变类型时,则需要用到global关键字

x=1
def foo():
    global x #声明x为全局名称空间的名字
    x=2
foo()
print(x) #结果为2

当实参的值为可变类型时,函数体内对该值的修改将直接反应到原值,

num_list=[1,2,3]
def foo(nums):
    nums.append(5)

foo(num_list)
print(num_list)
#结果为
[1, 2, 3, 5]

nonlocal、global关键字

global关键字

在函数内部修改全局变量,需要使用global关键字

global关键字可以声明当前局部变量为全局变量,从而实现修改局部变量结果全局变量也被修改

a = 100
def zzw():
    global a    # 使用global对变量进行声明,可以通过函数修改全局变量的值
    a = 10    # 此时,全局变量的值变为10
    print('函数内部:',a)
zzw()
print('函数外部:',a)
# 函数内部: 10
# 函数外部: 10

nonlocal关键字

对于嵌套多层的函数,使用nonlocal关键字可以将名字声明为来自外部嵌套函数定义的作用域(非全局)

nonlocal关键字,可以将当前局部变量向外部跨越一层,

如果当前函数外部是全局,则可以实现将函数内的局部变量声明为全局变量

def  f1():
    x=2
    def f2():
        nonlocal x
        x=3
    f2() # 调用f2(),修改f1作用域中名字x的值
    print(x) # 在f1作用域查看x

f1()

# 结果
3

nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常