为什么导入模块会执行所有语句?

6 投票
3 回答
2771 浏览
提问于 2025-04-18 03:47

这是我的模块:

test1.py

regions=["a","b","c"]
print "from test1 module"

test2.py

from test1 import regions
print "from test2 module", regions

运行 test2.py

$ python test2.py

# this is the output of the execution
from test1 module
from test2 module ['a', 'b', 'c']

我发现虽然我只从 test1.py 中导入了 regions 列表,但 test1.py 里的 print 语句还是被执行了。我并没有使用 import test1 这个指令,这个指令会让整个文件里的代码都执行。

  1. 为什么 test1.py 文件里的所有代码都会被执行(当然,如果有 if __name__==__main__ 的话,那部分代码不会被执行)?

  2. 怎样才能只从 test1 中导入 regions 列表,而不执行其他的代码呢?

我之前不知道导入是这样工作的,结果因为这个问题我已经花了三天在修bug了。

3 个回答

1

这是导入的工作方式——当你导入一个模块时,Python会执行这个模块。这种做法有它的好处,比如你可以在导入时检查依赖关系是否正确,或者在实际使用这个模块里的类之前,先初始化一些功能。

5

Python在执行一个模块里的所有语句时,是因为这些语句可能会有一些相关的副作用。举个例子,想象一下:

a = 2
b = a*3

如果我从那个模块里导入了b,会发生什么呢?一般来说,除了主模块以外,其他模块在被导入时不应该有那些会造成麻烦的副作用。通常,模块应该定义类、函数和变量,但不应该做一些像打开文件、连接数据库这样的事情。

6

这就是导入模块的工作原理。

def my_function():
    print("Hello")

上面的代码片段是什么呢?这肯定是一个函数的定义,但在Python中,函数定义是语句,必须被执行才能定义这个函数。所以当你导入上面的模块时,它会执行这个def,这样就创建了一个新函数,并把它赋值给my_function。这基本上和下面的内容是一样的:

my_function = ...definition..

所以当你导入一个模块时,你总是在执行它的内容。否则你就无法使用那个模块里的任何函数(或类)。

当然,Python还有其他方法来定义函数。

def create_my_function(x):
    def local_function():
        print(x)
    global my_function
    my_function = local_function

create_my_function("Hello")

这在大体上等同于最初定义的my_function()

由于你可以在Python模块中放入任何语句,Python无法知道哪些语句必须被执行才能定义你感兴趣的符号。因此,它必须执行所有的语句。

撰写回答