“导入X”和“来自X导入*”之间的区别?

时间:2012-09-04 20:33:09

标签: python import difference

在Python中,我不太清楚以下两行代码之间的区别:

import X

from X import *

难道他们都不是从模块X导入所有内容吗?有什么区别?

7 个答案:

答案 0 :(得分:43)

import x之后,您可以在x中引用x.something之类的内容。在from x import *之后,您可以直接引用x中的内容something。由于第二种形式将名称直接导入本地名称空间,因此如果从多个模块导入内容,则会产生冲突的可能性。因此,不鼓励使用from x import *

您也可以执行from x import something,它只将something导入到本地命名空间,而不是x中的所有内容。这样做更好,因为如果列出导入的名称,就会确切地知道要导入的内容,并且更容易避免名称冲突。

答案 1 :(得分:12)

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

答案 2 :(得分:6)

import X

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

from X import *

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

两个操作都将X添加到sys.modules,为true,但对本地命名空间的影响是差异。

答案 3 :(得分: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__ 属性中列出的所有”。“这允许模块编写者控制从模块中导出哪些函数和对象。

答案 4 :(得分:3)

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

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

如果您使用import X表单,不仅可以明确使用模块X.y,而且如果您对模块进行更改,现在可以使用reload函数需要重新进口。

答案 5 :(得分:1)

from X import *将模块X中的所有元素导入当前命名空间。 import X导入X但不“合并”命名空间。 E.g:

模块X:

def foo(): pass
BAR = 12

您的代码:

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

或者:

import X
X.foo()
print X.BAR

答案 6 :(得分:1)

让我们将其作为模块定义的一个例子

def my_func():
    return 1

from import会将所有内容拉入当前命名空间

from X import *
print my_func()

正常导入将在当前命名空间

中创建一个名为X的模块对象
import X
print x.my_func()

除了来自X import之外,my_func还可用于仅导入该功能。