为什么Python是从下往上运行我的代码的?
假设有这三个文件:
charNames.py
a = 'Susan'
b = 'Charlie'
c = 'Jiji'
threenames.py
a = 'dead'
b = 'parrot'
c = 'sketch'
print a,b,c
storytime.py
#!/usr/bin/env python
import charNames
import threenames
print charNames.a
threenames
我通过在终端输入 ./storytime.py
来运行 storytime.py
(这个文件也设置了可执行权限),然后得到了以下输出:
$ ./storytime.py
dead parrot sketch
Susan
$
为什么结果会先执行 print a,b,c
来自 threenames.py,而不是先运行 print charNames.a
呢?
根据我的理解,Python 是一种自上而下的编程语言,就像 bash 一样。那么它应该先打印 "Susan",再打印 "dead parrot sketch" 吧?
这是在 OSX 上运行的,使用的是 Python 2.7.5 版本。
2 个回答
3
当你使用 import
导入一个文件时,其实这个文件会被执行一遍。所以当你写 import threenames
的时候,那个文件就会运行,这就是为什么你会看到里面的输出(比如 print a,b,c
)在你以为自己调用它之前就已经出现了。
你应该避免在外部模块中直接打印东西,而是应该像你用 charnames.a
那样,打印里面的属性。
你应该使用类似 main()
函数的结构来组织代码:
if __name__ == '__main__':
print a, b, c
4
在Python中,当你导入一个文件时,这个文件里的代码会被执行。这就是为什么你首先看到threenames.py的输出,因为它在被导入后立刻就执行了。
如果你想让文件里的代码只在这个文件是主文件时运行,而不是在被导入时运行,你可以在threenames.py中使用以下代码:
if __name__ == '__main__':
print a, b, c
如果你直接运行threenames.py,你会看到a、b和c被打印出来,因为这是主文件。但是当这个文件被导入时,它就变成了一个模块,所以在那个条件里的打印函数和其他函数调用就不会被执行了。