本文试图整理一个清晰的思路来判断python中变量的作用域.
核心要点
- 总共有4个作用域:L(local, 本地作用域, 作用于函数内部), E(enclosing, 嵌套作用域, 作用于上一层函数), G(global, 全局作用域, 作用于整个模块), B(built-in, 内置作用域)
- 预编译的时候会按照Lolca-Enclosing-Global-Builtin的顺序根据变量赋值的位置进行类型判断.
- 执行的时候会根据变量类型去找对应的值
几个例子
下面例子演示了如何在一个函数中读取全局变量
var = 1
def test():
print(var)
test()
----------output------------
1
执行过程如下:
1.生成test函数的时候(line-2 to line-3).
1. 发现test函数中没有对var的赋值操作, 所以认为不是Local作用域.
2. 发现var变量在global处有赋值操作(line-1), 所以认为test函数中的var是global作用域.
2.执行test函数的时候(line-4), 当在test函数中打印var的时候(line-3)会读取global作用域中的var值, 即1.
下面这个例子演示了在一个函数中如果不进行显示声明, 是不能对全局变量进行写操作的.
var = 1
def test():
print(var)
var = 2
test()
----------output------------
Traceback (most recent call last):
File "test.py", line 5, in <