这个问题已经在这里有一个答案:
- 使用“从模块导入”“导入模块”或? 13个回答
在Python,我不是下面的代码两行之间的区别是很清楚:
import X
要么
from X import *
难道他们不都只有进口一切从模块X? 有什么不同?
这个问题已经在这里有一个答案:
在Python,我不是下面的代码两行之间的区别是很清楚:
import X
要么
from X import *
难道他们不都只有进口一切从模块X? 有什么不同?
之后import x
,您可以参考的东西在x
一样x.something
。 之后from x import *
,你可以参考的东西在x
直接,就像something
。 因为第二种形式直接进口的名字到局部名字空间,它会创建如果您从众多模块导入事冲突的可能性。 因此, from x import *
气馁。
您也可以from x import something
,其中进口只是something
到局部名字空间,而不是一切都在x
。 这是更好,因为如果你列出你导入的名字,你知道你正在导入到底是什么,它是更容易避免名称冲突。
import X
:这个进口一切, X.var1
, X.var2
等
from X import *
:这个进口寄托都为var1
, var2
等,也就是说,它充斥本地命名空间
看到后两个调用的区别:
>>> 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>}
import X
创建本地名称空间中引用该模块对象的标签。
from X import *
创建的每一个成员属性的标签X
模块,直接在本地命名空间。
这两种操作增加X
到sys.modules
,真实的,但对当地的命名空间效果的差异。
有差异,一些简单的,其他需要更多的解释。
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__
财产 。” 这使得模块的作者有在其功能和对象与它们的模块出口控制。
你永远不应该使用from X import *
除非你真的知道自己在做什么。 你可以从模块符号X与其他模块的符号,甚至自己的程序冲突。 我有这条规则唯一的例外是,有时from math import *
。
您可以使用的形式from X import y
从模块得到一个单一的东西。
如果您使用的import X
的形式,你不仅使你的模块明确的使用Xy
,但你现在可以使用reload
函数,如果你更改了模块,需要重新导入。
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
让我们用这个作为我们的模块定义的例子
def my_func():
return 1
该进口将拉动一切都变成了当前的命名空间
from X import *
print my_func()
正常的货物将在当前的命名空间创建一个名为X模块对象
import X
print x.my_func()
除了与X进口my_func,并将可用来只导入该功能。