为什么导入模块会执行所有语句?
这是我的模块:
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
这个指令,这个指令会让整个文件里的代码都执行。
为什么
test1.py
文件里的所有代码都会被执行(当然,如果有if __name__==__main__
的话,那部分代码不会被执行)?怎样才能只从
test1
中导入regions
列表,而不执行其他的代码呢?
我之前不知道导入是这样工作的,结果因为这个问题我已经花了三天在修bug了。
3 个回答
这是导入的工作方式——当你导入一个模块时,Python会执行这个模块。这种做法有它的好处,比如你可以在导入时检查依赖关系是否正确,或者在实际使用这个模块里的类之前,先初始化一些功能。
Python在执行一个模块里的所有语句时,是因为这些语句可能会有一些相关的副作用。举个例子,想象一下:
a = 2
b = a*3
如果我从那个模块里导入了b,会发生什么呢?一般来说,除了主模块以外,其他模块在被导入时不应该有那些会造成麻烦的副作用。通常,模块应该定义类、函数和变量,但不应该做一些像打开文件、连接数据库这样的事情。
这就是导入模块的工作原理。
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无法知道哪些语句必须被执行才能定义你感兴趣的符号。因此,它必须执行所有的语句。