我有一个模块 some_module.py
,其中包含以下代码:
def testf():
print(os.listdir())
现在,在名为 test.py
的文件中,我有以下代码:
import os
from some_module import testf
testf()
但是执行 test.py 会给我 NameError: name 'os' is not defined
。我已经在test.py
中导入了os
,testf
在test.py
的命名空间中。那么为什么会出现这个错误呢?
最佳答案
import
与包含文件内容不同,就好像您直接键入它来代替 import
陈述。如果您来自 C 背景,您可能会认为它以这种方式工作,其中 #include
预处理器指令执行此操作,但 Python 不同。
import
Python 中的语句读取正在导入的文件的内容并在其自己单独的上下文中对其进行评估 - 因此,在您的示例中,some_module.py
中的代码无法访问或了解 test.py
中存在的任何内容或任何其他文件。可以这么说,它是从一张“白纸”开始的。如果some_module.py
的代码想要访问 os
模块,你必须在 some_module.py
的顶部导入它.
当一个模块在 Python 中导入时,它变成了一个对象。也就是说,当你写
import some_module
Python 做的第一件事就是创建一个类型为 module
的新对象。代表正在导入的模块。当解释器遍历 some_module.py
中的代码时,它将在该文件中定义的任何变量、函数、类等分配为这个新模块对象的属性。所以在你的例子中,模块对象将有一个属性,testf
.当函数中的代码testf
想要访问变量 os
,它查看函数本身(本地范围)并看到 os
没有在那里定义,所以它会查看模块对象的属性 testf
属于(这是“全局”范围,虽然它不是真正的全局)。在您的示例中,它不会看到 os
在那里,所以你得到一个错误。如果你添加
import os
到some_module.py
, 那么这将在名称 os
下创建模块的属性,您的代码将找到所需的内容。
您可能还对我写的其他一些答案感兴趣,这些答案可能有助于您理解 Python 的 import
声明:
关于python - 从模块导入函数在 Python 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41480190/