缩进层级变量调用疑问:跨缩进层级使用变量的逻辑是什么?

核心结论:Python作用域与缩进无直接绑定关系,你此前的认知存在偏差
缩进只是Python用来标识代码块从属关系的语法规则,不会单独创建新的作用域。只有三类代码块会生成独立的作用域:模块(即单个py文件)、类定义块、函数定义块。我们平时写的if/for/while等流程控制语句对应的缩进块,和外层代码属于同一个作用域,不会产生作用域隔离。
你遇到的场景可以用以下示例复现:
# 逻辑与你截图的代码完全对应 if __name__ == '__main__': # 第一层缩进,属于当前模块作用域 num = 1 for i in range(3): # 第二层缩进,仍属于当前模块作用域 if i == 2: # 第三层缩进,仍属于当前模块作用域 print(num) # 正常输出1,不存在作用域隔离
底层运行逻辑:Python LEGB变量查找规则
Python访问变量时会按固定优先级查找变量定义,全程和缩进层级无关:
L(本地作用域):优先查找当前函数内部定义的变量E(外层嵌套函数作用域):如果处于嵌套函数内,向上查找外层函数定义的变量G(全局/模块作用域):查找当前py文件模块内定义的顶层变量B(内置作用域):查找Python内置的变量/函数,比如int、len等
只要在上述任意层级找到在调用前已经完成定义的变量,就可以正常访问,和中间隔了多少层缩进没有关联。
关于跨缩进层级使用的说明
只要变量所属的作用域允许访问,就可以跨缩进层级使用:
- 普通流程控制语句的缩进块不会创建新作用域,同一模块/函数下不管缩进多少层,都可以访问之前定义的变量
- 只有跨函数、跨类、跨模块的变量访问,才会受作用域规则限制
内容的提问来源于stack exchange,提问作者Lima
相关产品推荐
相关产品推荐

