“进口X”和“从X导入*”之间的区别是什么? [重复](Difference between “

2019-06-18 00:33发布

这个问题已经在这里有一个答案:

  • 使用“从模块导入”“导入模块”或? 13个回答

在Python,我不是下面的代码两行之间的区别是很清楚:

import X

要么

from X import *

难道他们不都只有进口一切从模块X? 有什么不同?

Answer 1:

之后import x ,您可以参考的东西在x一样x.something 。 之后from x import * ,你可以参考的东西在x直接,就像something 。 因为第二种形式直接进口的名字到局部名字空间,它会创建如果您从众多模块导入事冲突的可能性。 因此, from x import *气馁。

您也可以from x import something ,其中进口只是something到局部名字空间,而不是一切都在x 。 这是更好,因为如果你列出你导入的名字,你知道你正在导入到底是什么,它是更容易避免名称冲突。



Answer 2:

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>}


Answer 3:

import X

创建本地名称空间中引用该模块对象的标签。

from X import *

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

这两种操作增加Xsys.modules ,真实的,但对当地的命名空间效果的差异。



Answer 4:

有差异,一些简单的,其他需要更多的解释。

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__ 财产 。” 这使得模块的作者有在其功能和对象与它们的模块出口控制。



Answer 5:

永远不应该使用from X import *除非你真的知道自己在做什么。 你可以从模块符号X与其他模块的符号,甚至自己的程序冲突。 我有这条规则唯一的例外是,有时from math import *

您可以使用的形式from X import y从模块得到一个单一的东西。

如果您使用的import X的形式,你不仅使你的模块明确的使用Xy ,但你现在可以使用reload函数,如果你更改了模块,需要重新导入。



Answer 6:

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


Answer 7:

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

def my_func():
    return 1

该进口将拉动一切都变成了当前的命名空间

from X import *
print my_func()

正常的货物将在当前的命名空间创建一个名为X模块对象

import X
print x.my_func()

除了与X进口my_func,并将可用来只导入该功能。



文章来源: Difference between “import X” and “from X import *”? [duplicate]
标签: python import