"import X" 和 "from X import *" 的区别是什么?

25
在Python中,我不是很清楚以下两行代码的区别:
import X
或者
from X import *

它们不都只是从模块X中导入所有内容吗?有什么区别?


1
你怎么知道有什么区别? - eboix
2
我认为这主要是一个命名空间问题... import X 允许你维护不同的命名空间... 而 from X import * 则将它们放置在本地命名空间中。 - Joran Beasley
如果你不知道 from X import * 导入了什么,请不要使用它。如果你知道它导入了什么,也不要使用它。这只会污染你的命名空间。 - Matthias
7个回答

58

在使用import x后,你可以用x.something的方式来引用x中的内容。当使用from x import *时,你可以直接使用something来引用x中的内容。由于第二种形式会将名字直接导入本地命名空间,如果从多个模块导入东西,就可能产生冲突。因此,不建议使用from x import *

你也可以使用from x import something导入x中的一个具体的something,而不是所有内容。这样做更好,因为如果列出要导入的名称,你就确切知道导入了哪些内容,并且更容易避免名称冲突。


哪个更好:先 import xx.my_function(arguments),还是先 from x import my_functionmy_function(arguments) - mercury0114
我更喜欢前者,但两者都被广泛使用并且可以接受。 - BrenBarn

15

import X: 这将所有内容作为X.var1X.var2等导入。

from X import *:这将所有内容作为var1var2等导入,即它会淹没本地命名空间。

两个调用之后的区别如下:

>>> import math
>>> len(globals())  
5                          #no of variables in namespace
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, '__package__': None}
>>> 
>>>
>>> from math import *
>>> len(globals())
47                     #no of variables in namespace
>>> globals()
{'pow': <built-in function pow>, 'fsum': <built-in function fsum>, 'cosh': <built-in function cosh>, 'ldexp': <built-in function ldexp>, 'hypot': <built-in function hypot>, 'acosh': <built-in function acosh>, 'tan': <built-in function tan>, 'asin': <built-in function asin>, 'isnan': <built-in function isnan>, 'log': <built-in function log>, 'fabs': <built-in function fabs>, 'floor': <built-in function floor>, 'atanh': <built-in function atanh>, 'sqrt': <built-in function sqrt>, '__package__': None, 'frexp': <built-in function frexp>, 'factorial': <built-in function factorial>, 'degrees': <built-in function degrees>, 'pi': 3.141592653589793, 'log10': <built-in function log10>, '__doc__': None, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, 'asinh': <built-in function asinh>, 'fmod': <built-in function fmod>, 'atan': <built-in function atan>, '__builtins__': <module '__builtin__' (built-in)>, 'copysign': <built-in function copysign>, 'cos': <built-in function cos>, 'ceil': <built-in function ceil>, 'atan2': <built-in function atan2>, 'isinf': <built-in function isinf>, 'sinh': <built-in function sinh>, '__name__': '__main__', 'trunc': <built-in function trunc>, 'expm1': <built-in function expm1>, 'e': 2.718281828459045, 'tanh': <built-in function tanh>, 'radians': <built-in function radians>, 'sin': <built-in function sin>, 'lgamma': <built-in function lgamma>, 'erf': <built-in function erf>, 'erfc': <built-in function erfc>, 'modf': <built-in function modf>, 'exp': <built-in function exp>, 'acos': <built-in function acos>, 'log1p': <built-in function log1p>, 'gamma': <built-in function gamma>}

6
import X

在本地命名空间中创建一个标签,引用模块对象。

from X import *

在本地命名空间中为X模块的每个成员属性创建一个标签。

这两个操作都会将X添加到sys.modules,但对本地命名空间的影响是不同的。


3

除非你真的知道自己在做什么,否则永远不要使用from X import *。这样会从模块X中获取与另一个模块甚至你自己的程序中的符号冲突的符号。唯一的例外是有时可以使用from math import *

您可以使用from X import y形式从模块中获取单个内容。

如果使用import X形式,不仅可以显式地使用模块X.y,还可以使用reload函数,如果对模块进行更改并需要重新导入它。


3

这里有些差异,有些简单,有些需要更详细的解释。

import X 只是导入整个模块(也就是“运行模块”),并在本地作用域中指定一个名称。可以像这样给名称取别名:import X as Y

from X import * 默认情况下会将模块 X 的所有 属性 导入到本地作用域中。以下是不同用法的示例:

# Assume that module `X` contains an `opendb` function
import X
X.opendb('Y')

# VS.
from X import *
opendb('Y')

当一个模块定义了__all__时,情况就会变得稍微复杂一些。这会改变from X import *的语义,意思是“导入列在__all__属性中的所有内容”。这使得模块作者可以控制从他们的模块导出哪些函数和对象。


1

from X import *将模块X中的所有元素导入到当前命名空间。

import X导入X,但不会“合并”命名空间。例如:

模块X:

def foo(): pass
BAR = 12

您的代码:

from X import *
foo() # calls X.foo
print BAR # prints 12

或者:

import X
X.foo()
print X.BAR

1

让我们以这个作为我们模块定义的例子

def my_func():
    return 1

from import语句将所有内容导入到当前命名空间中

from X import *
print my_func()

普通的导入将在当前命名空间中创建一个名为X的模块对象

import X
print x.my_func()

另外,可以使用“from X import my_func”来仅导入该功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接