1. python作用域类型
1)函数中的局部作用域:local
2)嵌套函数中父级函数的局部作用域:enclosing
3)全局作用域:global
4)系统内置的变量:如 int、str、list 等关键字
变量的查找顺序为:局部作用域 > 父级函数作用域 > 当前模块全局作用域 > 系统内置作用域
2. 函数体内部对外部变量的引用
1)获取变量
函数内部可直接获取外部定义的变量
# 直接获取变量,此时打印结果为:a = 0 a = 0 def func1(): print(a)
如下所示,函数内再定义一个重名的变量,会优先引用局部作用域内的变量,并不会引用到全局变量
# 函数内再声明一个变量a,并赋值,此时函数内部打印的结果为:a = 1,函数外部打印的结果为:a = 0 a = 0 def func2(): a = 1 print(a) print(a)
2)修改全局变量
要想在函数内部对全局变量进行修改,需要使用 global 声明函数体内的这个变量是全局变量
# 用global声明这是一个全局变量,此时打印结果为:a = 1 a = 0 def func3(): global a a = 1 print(a)
3)修改父级函数定义的局部变量
先来看一个错误案例
# 这是一个装饰器,可以简单先理解为是一个嵌套函数,在父级函数中定义了变量 a,然后在最内层函数中修改 a 的值 def func_error(func): a = 5 def wrapper(): func() a = a + 1 print(a) return wrapper @func_error def error_demo(): pass error_demo()
执行后报错:UnboundLocalError: local variable 'a' referenced before assignment
原因是在wrapper函数内,没有找到局部变量 a,父级函数中定义的变量作用域只在父级函数的局部作用域
如果想要使用,则需要在wrapper内使用 nonlocal 来声明这是一个外层非全局的变量