为什么单个 Python 脚本中的两个主要函数可以工作?

cod*_*oke 1 python

我试图用 Python 做一些愚蠢的事情,并尝试了最愚蠢的事情(见下文)来看看 Python 的反应。令我惊讶的是它执行得非常完美。但我不明白为什么。

Python 如何知道要foo执行哪个?为什么它不执行相同的foo两次?

def main():
    foo()

def foo():
    print('this is foo 1.')

if __name__ == '__main__':
    main()

def main():
    foo()

def foo():
    print('this is foo 2.')

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

mkr*_*er1 7

Python 按输入文件中出现的顺序从上到下执行语句。

因此,它首先定义两个函数mainfoo然后调用main,导致 的输出foo“this is foo 1”。

然后它定义了另外两个函数,它们恰好也被命名为mainfoo,这些名称现在引用新函数,并且前两个函数不再可以通过这些名称访问。您也可以说新函数覆盖旧函数或重新定义它们。

然后它调用main(现在指的是新函数),这会导致新函数的输出foo“this is foo 2”。

另请注意,函数名称main在 Python 中没有特殊含义。


slo*_*rop 6

解释器按照它们在文件中出现的顺序执行这些操作:

  1. 定义main为该函数的第一个定义。

  2. 定义foo为该函数的第一个定义。

  3. 因为__name__is __main__:执行函数(当前定义为main),该函数调用当前定义为 的函数foo

  4. 重新定义main为该函数的第二个定义。(尽管这与第一个定义没有什么不同。)

  5. 重新定义foo为该函数的第二个定义。

  6. 因为__name__is __main__: 执行函数(当前定义为main),该函数调用当前定义为 的函数foo,现在这是您的第二个函数foo

您可能会假设解释器以某种方式执行“第一遍”并处理所有函数定义,然后才执行if __name__ == '__main__'. 但事实并非如此。这些步骤按顺序执行,就像运行以下命令一样:

x = 5
y = 7
print(x+y)
x = 6
y = 10
print(x+y)
Run Code Online (Sandbox Code Playgroud)

由于类似的原因,此代码将不起作用

if __name__ == '__main__':
   foo()

def foo():
   print(2)
Run Code Online (Sandbox Code Playgroud)

因为foo在引用它时未定义。