笔记
出处https://blog.csdn.net/lxy210781/article/details/81139493
L = Local 局部作用域
E = Enclosing 嵌套作用域
N = nonlocal 只作用于嵌套作用域,而且只是作用在函数里面
G = global 全局作用域
B = Built-in 内置作用域
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量.
1. L = Local 局部作用域
局部变量包含在def定义的函数体内。在函数体内声明的变量,默认都是局部变量,除非有特别说明,如全局变量的声明要用关键字global.
img1 = [12,34,56,78]
img2 = [1,2,3,4,5]
def displ():
print(img1)
def modi():
img1 = img2
modi()
displ()
结果输出为: [12, 34, 56, 78]
只能在外层作用域变量及以下找,修改为以下则输出 :[1, 2, 3, 4, 5]
img1 = [12,34,56,78]
img2 = [1,2,3,4,5]
def displ():
print(img1)
def modi():
img1 = img2
print(img1)
modi()
2. G = global 全局作用域
x=100
def h():
print(x)
x=10
h()
报错UnboundLocalError: local variable 'x' referenced before assignment
修改
x=100
def h():
global x
print(x)
x=10
h()
则输出100
3. nonlocal的用法
这个一般是用在闭包函数里. 但是一定要认识到, nonlocal声明的变量在上级局部作用域内,而不是全局定义, 如果在它声明的变量在上级局部中不存在,则会报错. 实例如下:
x = 123
def outer():
x = 100
def inter():
x = 200
inter()
print(x)
outer()
输出100
x = 123
def outer():
x = 100
def inter():
nonlocal x
x = 200
inter()
print(x)
outer()
输出200符合预期,而下面将上一级x去掉会报错SyntaxError: no binding for nonlocal 'x' found
x = 123
def outer():
#x = 100
def inter():
nonlocal x
x = 200
inter()
print(x)
outer()