什么是闭包?
闭包就是在一个函数内部再创建一个函数,内部的函数引用外部函数的变量,变量和内部的函数加起来成为闭包,闭包不会影响全局变量
Python变量的查找顺序是:
当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量
注意事项:如果闭包引用的变量是不可变类型,需要使用nonlocal声明,最好无论是不是可变类型,都使用nonlocal声明一下,nonlocal的作用是引用外部的非全局变量,作用于闭包内部,global是当你想要在函数内部的作用域中想要修改全局的变量时,需要使用global
def outer(start):
def inner():
nonlocal start
start += 1
return start
return inner
def outer1(start):
def inner():
start[0] += 1
return start
return inner
run = outer(10)
print(run())
>>11
print(run())
>>12
run1 = outer1([1])
print(run1())
>>[2]
print(run1())
>>[3]
print(start) # 会报没有定义的错误
比较nonlocal和global
def scope_test():
def do_local():
spam = "local spam" #此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外层的spam是两个变量,如果写出spam = spam + “local spam” 会报错
def do_nonlocal():
nonlocal spam #使用外层的spam变量
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignmane:", spam)
do_nonlocal()
print("After nonlocal assignment:",spam)
do_global()
print("After global assignment:",spam)
scope_test()
print("In global scope:",spam)
输出结果:
>>After local assignmane: test spam
>>After nonlocal assignment: nonlocal spam
>>After global assignment: nonlocal spam
>>In global scope: global spam
在闭包中使用global会修改最外层的全局变量
def add_b():
global b
b = 42
def do_global():
global b # 如果去掉这句 会报错,这是因为global的全局变量,在函数内部职能引用不能修改,想修改也要global
b = b + 10
print(b)
do_global()
print(b)
add_b()
print(b)
输出结果:
>>52
>>52
>>52
网友评论