ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
块作用域 ------------------- 1) Python **没有** 块级作用域 代码1:块作用域 ~~~ # if/try/for 不会引入新的作用域 if True: x = 1 print(x) # 1 for x in range(5): pass print(x) # 4 ~~~ 2) **只有函数、类、模块会产生作用域,代码块不会产生作用域。** 代码2:函数作用域 ~~~ def f(): i = 1 f() print(i) # NameError: name 'i' is not defined ~~~ 规则 ----- 1) **静态作用域规则** 代码3-1:静态作用域 ~~~ i = 1 def test(): i += 1 test() # UnboundLocalError: local variable 'i' referenced before assignment ~~~ 代码3-2:静态作用域 ~~~ i = 1 def test(): print(i) i += 1 test() # IndentationError: unindent does not match any outer indentation level ~~~ 代码4:静态作用域 ~~~ i = 1 def g(): print(i) def f(): i = 2 g() f() # 1 ~~~ 2) **最内嵌套作用域规则** 代码5:最内嵌套作用域 ~~~ i = 1 def f(): i = 2 def g(): print(i) return g func = f() # 无任何输出 func() # 2 print(i) # 1 ~~~ 分类 ------------------- L:local -- 局部作用域,当前函数 E:enclosing -- 嵌套作用域,外层函数 G:global -- 全局函数,模块 B:built-in -- builtins模块 LEGB --------- 变量查找法则:LEGB 查找顺序:局部 -> 嵌套 -> 全局 -> builtins global & nonlocal -------------------- global:局部作用域 中使用/修改 全局变量 nonlocal:局部作用域 中使用/修改 外层(非全局)变量 ~~~ # global: i = 1 def test(): global i i += 1 test() print(i) # 2 ~~~ ~~~ # nonlocal a = 0 def outer(): b = 0 def inner(): nonlocal b a = 1 b = 1 inner() print(b) outer() # 1 print(a) # 0 ~~~ 小结 ---- 变量在python作用域中,最基本的两点: 1) **可读**:内层未申明的变量会自动向外层寻找。 内层作用域可读外层作用域变量。 2) **不可变**:内外层均申明过的变量是相互独立的。 内层作用域可重新申明赋值外层作用域变量,但此时其实是在内层命名空间中重新定义的一个新变量,并不会改变外层作用域变量的值。