【问题标题】:Why is Python saying modules are imported when they are not?为什么 Python 说模块是导入的,而实际上它们不是?
【发布时间】:2022-11-27 10:43:46
【问题描述】:

蟒蛇 3.6.5

使用 this answer 作为指南,我试图查看是否导入了某些模块,例如 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

【问题讨论】:

  • 这回答了你的问题了吗? Where are math.py and sys.py?
  • 如果 math 是内置的,为什么除非我导入它,否则它不起作用?
  • 因为即使是内置模块也需要导入。这就是语言的工作原理
  • @PranavHosangadi 不一定。我没有可用于测试的 Python 3.6,但至少在 Python 3.9 中,math不是一个内置模块,比如(比如)os

标签: python


【解决方案1】:

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

def import_math():
    import math

import_math()

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

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

import_math()
print("math" in sys.modules)

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

import_math()
math = sys.modules["math"]

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

import math

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

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

print("math" in globals())
print("math" in locals())

如果“math”没有导入到全局或本地范围内,因此无法访问,它将打印 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2018-04-19
    • 2014-01-30
    • 2010-12-06
    • 2020-06-04
    • 1970-01-01
    相关资源
    最近更新 更多