作用域
定义在函数内部的变量是局部变量。局部变量不能在外部使用。示例:
def fun():
num = 10 # 局部变量
print(num) # NameError: name 'num' is not defined
函数嵌套
在一个函数A内部再定义一个函数B,这个B就是嵌套函数。
def outer():
# outer 是外围函数
msg = "I love you"
def inner():
# inner是嵌套函数
print(msg)
inner()
print_msg() # 输出 I love you
闭包
外部函数A定义了局部变量a,内部函数B使用了a,且A的返回值为函数B。
def outer():
msg = "I love you"
def inner():
print(msg)
return inner
c = outer()
c() # 输出 I love you
一般情况下,函数中的局部变量仅在函数的执行期间可用,闭包使得局部变量在函数外被访问了。
这里的c
就是一个闭包,闭包本质是一个函数,它由inner函数和变量msg组成
闭包——修改数据
x = 3
def test1():
x = 2
def test2():
print('-----A------%d' % x)
x = 1
print('-----B------%d' % x)
return test2
t = test1()
t() # 报错。
程序报错,如果注释掉第8行,则输出两次2。
这是因为在第一次print时,发现函数内部有x
,却没有在print语句前找到自己的x
,所以报错。
类似声明全局变量一样(global),要声明nonlocal
:
def test2():
nonlocal x
print('-----A------%d' % x)
x = 1
print('-----B------%d' % x)
return test2