这是我的模块:
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']
我看到调用了来自
print
的 test1.py
语句,尽管我只从 regions
导入 test1.py
列表。我没有使用导致所有内容被执行的指令import test1
。
为什么它执行
test1.py
文件中的所有内容(当然不是指令if __name__==__main__
下的代码,如果包含的话)。
如何仅
import
来自 regions
的 test1
列表而不执行所有其他语句?
我不知道导入是如何工作的,因此我已经研究了 3 天的错误。
这就是进口的运作方式。
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无法知道必须执行哪些语句才能定义您感兴趣的符号。因此它必须执行所有语句。
Python需要执行模块中的所有语句,因为它们可能会产生相关的副作用。例如考虑
如果我从该模块导入 b 会发生什么? 一般来说,除 main 之外的模块不应具有导入时有害的副作用。一般来说,模块应该定义类、函数和变量,但不应该执行打开文件、连接数据库等操作。
这就是导入的工作方式 - python 在导入时执行模块。这有它的用处,因为您可以包含验证依赖关系的功能,或者在导入模块实际调用任何类之前初始化功能。