我不明白的地方是,到 print 这一行如何知道 x 是 local 还是 global 呢?到这一步还没有分析赋值语句,怎么会当做 local 来对待?
难道是先分析一遍建立符号表,然后再分析一遍进行语法分析?
In [1]: x = 10
In [2]: def func():
...: print(x)
...: x = 20
...:
In [3]: func()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-3-08a2da4138f6> in <module>()
----> 1 func()
<ipython-input-2-84a4e5530b9a> in func()
1 def func():
----> 2 print(x)
3 x = 20
4
UnboundLocalError: local variable 'x' referenced before assignment
1
chenstack 2017-08-08 18:19:14 +08:00
因为是在函数中,函数对象构造时会生成 local 变量名表。
比如上述 func,当函数中有 x = 20 时, func.__code__.co_varnames 是 ('x',) 当只有 print(x)时 func.__code__.co_varnames 是 () def 关键字其实就是生成函数对象的 |
3
chenstack 2017-08-08 18:30:30 +08:00
想深入了解的话可以读一下 python 的源码,其实生成函数对象时已经生成字节码了。__code__里也有很多学问的,另外也有一些内建函数可以手动编译出 code object。
|