Python 解释器实际上是如何解释程序的?
How does Python interpreter actually interpret a program?
拿一个示例程序:
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中,在较窄的函数范围内引用全局变量时,如果修改值,必须先告诉代码,全局变量就是你引用的变量,而不是一个新的本地的。您可以使用 global 关键字来执行此操作。在此示例中,您的程序实际上应如下所示:
c = 10
def myfunc():
global c
print(c)
c = 1
myfunc()
Miles C. 是正确的。
我猜虽然从你的代码中你是从结构化语言(如 C 或 C++)过来的。
Python 不会像 C 或 C++ 那样引用变量,需要被告知这样做。
global 关键字告诉 python 您正在寻找函数外部的变量。
简介
在解释器接管之前,Python 执行其他三个步骤:词法分析、解析和编译。这些步骤一起将源代码从文本行转换为包含解释器可以理解的指令的字节代码。解释器的工作就是获取这些代码对象并按照说明进行操作。
为什么?
所以这个错误是Python在将源代码翻译成字节码的时候产生的。在此步骤中,还确定了范围。这是因为字节码需要引用正确的变量位置。但是,在这种情况下,它现在连接到引用一个未在范围内定义的变量,导致运行时出错。
例子
这段代码中没有语法错误,也没有范围错误。
c = 10
def myfunc():
print(c)
myfunc()
在此程序中,c = 1
隐式地使变量成为局部变量。但是,这是在 之后定义的 print(c)
尚未在其范围内定义。
c = 10
def myfunc():
print(c)
c = 1
myfunc()
因此,如果您这样做:
c = 10
def myfunc():
c = 1
print(c)
myfunc()
或
c = 10
def myfunc():
global c # Changes the scope of the variable to make it accessible to the function
print(c)
c = 1
myfunc()
代码可以正常工作。
结论
回答你的问题:
Does it go through all the code, parse it before executing them line
by line?
是的,确实如此。
拿一个示例程序:
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中,在较窄的函数范围内引用全局变量时,如果修改值,必须先告诉代码,全局变量就是你引用的变量,而不是一个新的本地的。您可以使用 global 关键字来执行此操作。在此示例中,您的程序实际上应如下所示:
c = 10
def myfunc():
global c
print(c)
c = 1
myfunc()
Miles C. 是正确的。 我猜虽然从你的代码中你是从结构化语言(如 C 或 C++)过来的。 Python 不会像 C 或 C++ 那样引用变量,需要被告知这样做。 global 关键字告诉 python 您正在寻找函数外部的变量。
简介
在解释器接管之前,Python 执行其他三个步骤:词法分析、解析和编译。这些步骤一起将源代码从文本行转换为包含解释器可以理解的指令的字节代码。解释器的工作就是获取这些代码对象并按照说明进行操作。
为什么?
所以这个错误是Python在将源代码翻译成字节码的时候产生的。在此步骤中,还确定了范围。这是因为字节码需要引用正确的变量位置。但是,在这种情况下,它现在连接到引用一个未在范围内定义的变量,导致运行时出错。
例子
这段代码中没有语法错误,也没有范围错误。
c = 10
def myfunc():
print(c)
myfunc()
在此程序中,c = 1
隐式地使变量成为局部变量。但是,这是在 之后定义的 print(c)
尚未在其范围内定义。
c = 10
def myfunc():
print(c)
c = 1
myfunc()
因此,如果您这样做:
c = 10
def myfunc():
c = 1
print(c)
myfunc()
或
c = 10
def myfunc():
global c # Changes the scope of the variable to make it accessible to the function
print(c)
c = 1
myfunc()
代码可以正常工作。
结论
回答你的问题:
Does it go through all the code, parse it before executing them line by line?
是的,确实如此。