【发布时间】:2014-03-25 14:15:25
【问题描述】:
我已经阅读了以下帖子,但我仍然不确定。
如果我有一个包含以下代码的 Python 文件 myfunctions.py。
x = 3
def f():
print x
x = 2
然后,说$ python myfunctions.py 运行得很好。
但是现在对上面的文件做一点小改动。新文件如下所示。
x = 3
def f():
print x
x = 2
f() # there is a function call now
这一次,代码给出了一个错误。现在,我试图理解这种行为。到目前为止,这些是我的结论。
- Python 为
x=3创建字节码 - 它创建了一个函数对象 f,快速扫描并具有字节码,该字节码涉及 f 范围内的局部变量,但请注意,Python 中所有语句的字节码不太可能已经构建。
- 现在,Python 遇到一个函数调用,它知道这个函数调用是合法的,因为存在讨论函数对象 f 及其局部变量的最小字节码。
- 现在解释器负责执行字节码,但从最初的足迹,它知道 x 在这里是一个局部变量,并说 - “为什么在分配之前要打印?”
有人可以对此发表评论吗?提前致谢。如果之前已经解决过这个问题,我们深表歉意。
【问题讨论】:
-
我假设额外的缩进不在您的实际文件中,并且例外是
UnboundLocalError? -
错误是什么?在第二个例子中,缩进是否应该在“def”行被打破?
-
我得到的错误(修复缩进后)是
UnboundLocalError: local variable 'x' referenced before assignment -
对这个愚蠢的错误深表歉意。我已经修复了缩进。那不是问题。问题涉及范围。该错误是关于 Python 抱怨在分配变量之前使用了该变量。
标签: python function interpreter