当您运行一个程序时,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()
发布于 2017-07-11 03:51:32
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在cough()
之前就知道了什么是cough()
函数。在这里,您可能会想:“为什么python不抛出一个错误,因为它不知道caugh()
在main()
中是什么”,很好的问题,我的朋友。
但是,只要在调用之前定义了函数,一切都很好。因为请记住,在调用函数之前不会“检查”是否定义了函数。因此,在本例中,即使是在python读取函数main()
时,也没有定义tho cough()
,因为在下面定义了main()
之后,我们才调用main()
。
def main():
for i in range(3):
cough()
def cough():
print('cough')
if __name__ == '__main__':
main()
希望这有助于您更好地理解Python。
发布于 2017-07-11 03:56:57
防止错误发生的代码如下:
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
发布于 2017-07-11 03:57:26
当Python在执行源代码时遇到一个函数时,它不会立即运行该函数。相反,它将函数编译为可执行代码对象,并等待直到您实际调用该函数。
这意味着Python唯一一次检查cough()
是真正定义的,是在调用main()
时。而且,由于Python在调用cough
时确实找到了main
函数,因此不会引发错误。
换句话说:在运行时之前不会验证函数中使用的名称是否存在,因此您可以使用当前未定义的变量名称。
这与函数在定义时不会引发错误的原因相同,但在运行时会引发错误:
>>> 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依赖于函数中的每个名称,无论是全局的还是本地的,在尝试使用它们之前都已经定义好了。
https://stackoverflow.com/questions/45025005
复制相似问题