笔记

出处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()

 

posted @ 2022-03-12 20:05  街景i  阅读(184)  评论(0编辑  收藏  举报