我试图用 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)
Python 按输入文件中出现的顺序从上到下执行语句。
因此,它首先定义两个函数main,foo然后调用main,导致 的输出foo“this is foo 1”。
然后它定义了另外两个函数,它们恰好也被命名为main和foo,这些名称现在引用新函数,并且前两个函数不再可以通过这些名称访问。您也可以说新函数覆盖旧函数或重新定义它们。
然后它调用main(现在指的是新函数),这会导致新函数的输出foo“this is foo 2”。
另请注意,函数名称main在 Python 中没有特殊含义。
解释器按照它们在文件中出现的顺序执行这些操作:
定义main为该函数的第一个定义。
定义foo为该函数的第一个定义。
因为__name__is __main__:执行函数(当前定义为main),该函数调用当前定义为 的函数foo。
重新定义main为该函数的第二个定义。(尽管这与第一个定义没有什么不同。)
重新定义foo为该函数的第二个定义。
因为__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在引用它时未定义。