def first():
return second()
def second():
return 0
x = first()
def first():
return second()
x = first()
def second():
return 0
second
不存在.Python 作为一门解释型语言, 出现这样的事情很有可能是这样的原因, 假设现在正在交互模式下执行, 那么输入
def first():
return second()
x = first()
second
这个符号确实还没有被定义, 故产生错误. 但是如果上述代码内容是写在文件里的, 那么 Python 完全可以扫描整个文件以获得充分的上下文信息, 并正确地检测出 second
函数定义, 只是 Python 没有这么做.熟悉 C++ 的同学这时候肯定跳出来了, 因为在 C++ 类空间中, 这种引用是合法的, 如
struct type {
int first()
{
return second();
}
type()
: x(first())
{}
int second()
{
return 0;
}
int x;
};
struct type {
int first()
{
return second();
}
type()
: x(first())
{}
int second()
{
return x;
}
int x;
};
x
来初始化它自身, 虽然这样的代码只有手贱的程序员在极其罕见的情况下才会写出这样的代码 (比如我在写这篇博客的时候), 但是本着编译器的职责, 完全应该想方设法让这种情况编不过去.好了, 还是先回到 Python 上来, Python 不允许这样的代码编译过去, 是因为这个原因么? 假设有下面的程序成功被解释执行
def first():
return second()
x = first()
def second():
return x