我想知道if __name__ == "__main__":
在python中真正做了什么,我在python3中有以下代码:
def main():
test();
def test():
print("hello world " + __name__);
if __name__ == "__main__":
main();
我们知道在使用之前我们必须声明一个函数,因此if
部分内的函数调用工作正常,main()
在if
内调用之前定义语句,但是test()函数怎么样,它在被调用后定义并且没有错误:
def main():
test();
def test():
print("hello world " + __name__);
那么如果test()
函数在被调用后被定义了怎么能呢?
答案 0 :(得分:5)
调用后,测试不。订单是:
main
。这引用了一个(尚未定义的)test
,但实际上并没有使用(调用)它。 Python就可以了。test
。main
。main
来电test
。没问题,因为它已经定义了。答案 1 :(得分:1)
这里的问题实际上与if __name__ == 'main'
无关。请考虑以下代码:
def do_something():
do_something_else()
以上是有效的函数声明。 即使我还没有写do_something_else()
。您可以在交互式口译员中尝试这一点。现在,当我实际致电 do_something()
时:
do_something()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-21-3d57cd7a951b> in <module>()
----> 1 do_something()
<ipython-input-20-5d71722aad44> in do_something()
1 def do_something():
----> 2 do_something_else()
3
NameError: global name 'do_something_else' is not defined
错误了。如果在调用do_something()
之前的某个时刻,我已经定义了do_something_else
函数,那就不会了。
那么,这是什么意思? Python确实从上到下解释。但是当达到函数定义时,它只是编译函数,它不会执行它。
答案 2 :(得分:0)
Python按照它看到的顺序执行代码。
您键入def main():
它将其作为函数定义以便稍后运行。
if __name__ == "__main__":
检查当前文件是否应该运行(而不是包含)。在这种情况下,它将执行以下任何内容(通常为main
)
你可以这样说:
print "here"
def main():
print "in main"
if __name__ == "__main__"
main()
你应该看到像
这样的输出here
in main
这是因为python本质上是一种脚本语言,函数是可选的。 对于任何不打算在接下来的10分钟内抛弃的代码,你应该使用函数和类。它们使代码更容易理解跟随和调试。
您的特定代码工作的原因(在main之后定义测试)是您在定义所有内容后运行它。除非你运行main,否则Python不会尝试检查是否有test
被调用。当您运行main
时,test
已经定义。
答案 3 :(得分:0)
我们知道在使用它之前必须声明一个函数
听起来你是来自C家族的一种语言。这些语言在两个方面有所不同。
首先,Python没有“声明”任何东西。这在C语言中是有意义的,其中变量是值存储的类型化内存位置。但是在Python中,值具有它们自己的独立类型和位置,变量只是这些值的名称,因此没有任何要声明的内容。 / p>
现在,Python要求你在使用之前定义一个函数,就像C一样。
但只有C 还要求您在编译其正文使用它的函数之前定义或至少声明一个函数。区别与上面相同 - C需要声明的函数,获取类型,指向函数实际代码的指针等;在Python中,该函数只是函数对象值的名称。要编译一个函数,它需要知道的是查找名称的位置。这很简单:它编译函数,以便在运行时,它将查找模块全局变量中的名称。由于不需要其他信息,因此无需申报。
例如,在C中,这是合法的:
void foo() {}
void bar() { foo(); }
这就是:
void foo();
void bar() { foo(); }
void foo() {}
但这不是:
void bar() { foo(); }
void foo();
在Python中,因为没有声明,所以第二个和第三个是相同的,因此都是完全有效的:
def bar():
foo()
def foo():
pass