为什么在Python中需要指定特定类进行导入?

18 投票
4 回答
25415 浏览
提问于 2025-04-16 15:59

我刚刚把我的Python升级到了2.7.1(在Mac上),这样我就可以使用OrderedDicts了。

然后我尝试运行下面的脚本:

import collections

test = OrderedDict()

结果我得到了:

NameError: name 'OrderedDict' is not defined

我通过以下方式解决了这个问题:

from collections import OrderedDict

...但是我想知道为什么我需要这样做?

为什么简单的import collections对我没有用呢?

4 个回答

2

我觉得事情是这样的:

当你写 import collections 的时候,其实是在当前的命名空间里,把“collections”这个模块赋值给了一个叫 collections 的变量。

这时,你可以通过 collections.OrderedDict 来访问 collections 模块里的 OrderedDict 类。

但是 import collections 并不会 在本地命名空间里自动创建其他变量。也就是说,它不会把 collections 模块里的所有东西都自动赋值给变量(不过,正如其他回答中提到的,你可以手动这样做)。

至于 为什么 不这样做,我觉得这和 Python 之禅 中的第二条有关:“显式优于隐式。”

4

你可以用 import * from fooModule 这种方式来导入模块里的所有东西,但这样做不好,会让人很不高兴。

想知道为什么这样做不好,可以输入 import this 来看看简单的解释。

30
import collections

这段代码把“collections”这个模块引入到当前的命名空间里,这样你就可以像这样使用它:

import collections
orderedDict = collections.OrderedDict()

不过,如果你只需要某个特定的功能(而不是整个库),你可以这样做:

from collections import OrderedDict

这段代码只把指定的类引入到当前的命名空间里。

撰写回答