gpt4 book ai didi

python - 当模块已经导入时,为什么我需要显式导入它们?

转载 作者:行者123 更新时间:2023-12-01 09:12:24 24 4
gpt4 key购买 nike

每当我在 Ubuntu Linux 上运行命令时:

python3 -v

我得到了一个详细的输出,它告诉我:

import _frozen_importlib # frozen
import _imp # builtin
import sys # builtin
import '_warnings' # <class '_frozen_importlib.BuiltinImporter'>
import '_thread' # <class '_frozen_importlib.BuiltinImporter'>
import '_weakref' # <class '_frozen_importlib.BuiltinImporter'>
import '_frozen_importlib_external' # <class '_frozen_importlib.FrozenImporter'>
import '_io' # <class '_frozen_importlib.BuiltinImporter'>

还有更多。

但是,我看到 import sys 被执行了,但我仍然需要手动导入 sys 才能使用它。为什么会发生这种情况?

最佳答案

简短(且不准确)的版本:import foo 做了两件事:

  • 它会查找并从光盘加载名为“foo”的模块,如果必要
  • binds将模块命名为当前命名空间中的名称 foo

出于同样的原因,您必须“手动导入”sys,这不起作用:

>>> def r():
... import random
... print(random.randint(0, 100))
...
>>> r()
26
>>> random.randint(10, 20)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'random' is not defined

证明导入并不神奇的方法:

$ cat foo.py 
print('foo has been imported')

def fn():
print('fn has been called')
$ python
>>> import importlib
>>> bar = importlib.__import__('foo')
foo has been imported
>>> bar.fn()
fn has been called

模块名称的作用与 Python 中的任何其他名称类似:

importlib.__import__() 创建一个值(在本例中为模块),并且 = 将其分配给名称。

使用传统导入时,import foo 创建一个值(同一模块)并将其分配给给定名称(恰好与模块名称相同)。

您可以像这样验证模块是否只加载一次:

$ python
>>> import foo
foo has been imported
>>> import foo
>>>

并且您可以证明模块只是另一个值:

>>> import foo
foo has been imported
>>> foo.fn()
fn has been called
>>> bar = foo
>>> bar.fn()
fn has been called

关于python - 当模块已经导入时,为什么我需要显式导入它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51545685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com