为什么Python是从下往上运行我的代码的?

0 投票
2 回答
1342 浏览
提问于 2025-04-17 21:24

假设有这三个文件:

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被打印出来,因为这是主文件。但是当这个文件被导入时,它就变成了一个模块,所以在那个条件里的打印函数和其他函数调用就不会被执行了。

撰写回答