当你运行它时,Python如何“读入”一个程序?例如,我不明白为什么下面的代码中没有NameError: name 'cough' is not defined
:
def main():
for i in range(3):
cough()
def cough():
print('cough')
if __name__ == '__main__':
main()
基本上,我的问题也可以说明为什么上面和下面的程序输出相同的东西:
def cough():
print('cough')
def main():
for i in range(3):
cough()
if __name__ == '__main__':
main()
答案 0 :(得分:10)
Python是解释语言,按语句执行声明 (感谢viraptor的提示:当编译为字节码时,它发生在整个文件+每个函数上)
在这种情况下,程序会逐行读取并知道函数cough()
和main()
已定义。稍后当调用main()
时,Python会知道它是什么以及main()
何时调用cough()
Python也知道它是什么。
def cough():
print('cough')
def main():
for i in range(3):
cough()
if __name__ == '__main__':
main()
在另一个案例中(下文),它是一回事。只是Python在main()
之前了解cough()
函数是什么。在这里你可能想知道:“为什么python不会抛出错误,因为它不知道caugh()
里面main()
是什么?”好问我的朋友。
但是只要你在调用它之前定义了你的函数,一切都很好。因为记住 Python不会“检查”函数是否被定义,直到你调用它。所以在这种情况下甚至当python正在读取函数cough()
时没有定义main()
没关系,因为我们在下面定义main()
之后才调用cough()
。
def main():
for i in range(3):
cough()
def cough():
print('cough')
if __name__ == '__main__':
main()
希望这有助于您更好地理解Python。
答案 1 :(得分:2)
防止错误发生的代码是:
if __name__ == '__main__':
main()
因为你把它放在代码的末尾,在python之后阅读上面的所有代码。 如果您尝试编写类似
的内容def main():
for i in range(3):
cough()
if __name__ == '__main__':
main()
def cough():
print('cough')
你要得到的就是:
NameError: name 'cough' is not defined
答案 2 :(得分:1)
当Python在执行源代码时遇到函数时,它不会立即运行该函数。相反,它将函数编译为可执行代码对象,并等待直到您实际调用该函数。
这意味着,只有当您调用cough()
时,Python才会检查main()
定义的唯一时间。由于Python在调用cough
时确实找到main
函数,因此不会引发错误。
换句话说: Python不会在运行时验证函数中使用的名称是否实际存在,因此您可以使用当前未定义的变量名称。
这与此类函数在定义时不会引发错误的原因相同,但在运行时它会发生错误:
>>> def func():
a + b
>>> func # func was compiled...
<function func at 0x7f8ddd5d6488>
>>> func() # but we cannot call it.
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
func() # but we cannot call it.
File "<pyshell#7>", line 2, in func
a + b
NameError: name 'a' is not defined
>>>
另请注意,如果您在定义咳嗽之前尝试拨打main
,则将收到错误:
>>> def main():
for i in range(3):
cough()
>>> main()
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
main()
File "<pyshell#12>", line 3, in main
cough()
NameError: name 'cough' is not defined
>>>
这表明Python在您尝试使用它们之前,依赖于函数中的每个名称,无论是全局还是本地,都已定义。
答案 3 :(得分:0)
Python从脚本顶部读取到底部。在这两个示例中,cough()
函数在定义后调用。
当您在main()
内定义cough()
时,cough()
函数实际上并未运行。直到最后一行才会运行 - 也就是在它们已经定义之后。
答案 4 :(得分:0)
那是因为真正的执行代码在这里
如果名称 ==&#39; 主要&#39;: main()的
当调用main()时,已经定义了main和cough