为什么 Python 说模块已导入,但实际上并未导入?

Emm*_*maV 8 python

Python 3.6.5

使用这个答案math作为指导,我尝试查看是否导入了某些模块,例如。

但 Python 告诉我它们都被导入了,而实际上它们并没有导入。

>>> import sys
>>> 'math' in sys.modules
True
>>> 'math' not in sys.modules
False
>>> math.pi
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'math' is not defined
>>> import math
>>> 'math' in sys.modules
True
>>> math.pi
3.141592653589793
Run Code Online (Sandbox Code Playgroud)

Ahm*_*AEK 9

为了解释这一点,让我们定义这个函数:

def import_math():
    import math

import_math()
Run Code Online (Sandbox Code Playgroud)

上面的函数将导入模块 math,但仅在其本地范围内,任何尝试在math其外部引用的人都会收到名称错误,因为math未在全局范围中定义。

导入的任何模块都会保存到 sys.modules 中,因此调用检查

import_math()
print("math" in sys.modules)
Run Code Online (Sandbox Code Playgroud)

将打印 True,因为 sys.modules 缓存在任何地方加载的任何模块,无论它是否在全局范围内可用,math在全局范围内定义的一个非常简单的方法将是

import_math()
math = sys.modules["math"]
Run Code Online (Sandbox Code Playgroud)

这会将其从仅在范围内转换sys.modules为在全局范围内,这相当于

import math
Run Code Online (Sandbox Code Playgroud)

math它在全局范围内定义了一个指向 module 的变量math

现在,如果您想查看“math”是否存在于全局范围内,请直接检查它是否在全局范围内。

print("math" in globals())
print("math" in locals())
Run Code Online (Sandbox Code Playgroud)

如果“math”未导入全局或局部范围并因此无法访问,则会打印 false。