【发布时间】:2021-12-29 03:06:57
【问题描述】:
拿一个示例程序:
c = 10
def myfunc():
print(c)
myfunc()
这会按预期打印 10,但如果我们查看另一个程序:
c = 10
def myfunc():
print(c)
c = 1
myfunc()
上面写着:local variable 'c' referenced before assignment
在这里,如果 python 解释器实际上是逐行运行,它不应该在到达下一行之前打印10 以得出局部变量的结论吗?
Python 有一个词法分析器、分词器和解析器。它是否遍历所有代码,在逐行执行之前对其进行解析?
这就是为什么它可以说函数下面有一个局部变量吗?
【问题讨论】:
-
在执行开始之前,所有的 Python 都会被编译为字节码 - 任何语法错误都会阻止你的代码运行,并且在这个编译步骤中也必须确定范围(因为字节码需要引用正确的变量位置)。
-
“解释器”并不意味着“逐行”。没有什么说解释器必须先执行一行才能读取下一行。
-
(即使它确实暗示了这一点,Python 也必须在到达调用函数的行之前读取整个函数定义。)
-
“[C]Python 有一个词法分析器、分词器和解析器。它是否会遍历所有代码,在执行 [字节码] 之前对其进行解析”——是的,确实如此。
-
这能回答你的问题吗? Python Compilation/Interpretation Process
标签: python interpreter python-internals