本问题已经有最佳答案,请猛点这里访问。
在Python中,我不太清楚以下两行代码之间的区别:
import X
要么
from X import *
难道他们都不是从模块X导入所有内容吗? 有什么不同?
你怎么知道有区别的?
我相信它主要是命名空间问题... import X允许您维护单独的命名空间...而from X import *将它们放在本地命名空间中
如果你不知道from X import *导入什么不使用它。 如果你知道它导入了什么......不要使用它。 你只是在污染你的命名空间。
在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 *:它导入everthing为var1,var2等,即它泛滥本地命名空间
看到两个电话后的差异:
>>> import math
>>> len(globals())
5 #no of variables in namespace
>>> globals()
{'__builtins__': , '__name__': '__main__', '__doc__': None, 'math': , '__package__': None}
>>>
>>>
>>> from math import *
>>> len(globals())
47 #no of variables in namespace
>>> globals()
{'pow': , 'fsum': , 'cosh': , 'ldexp': , 'hypot': , 'acosh': , 'tan': , 'asin': , 'isnan': , 'log': , 'fabs': , 'floor': , 'atanh': , 'sqrt': , '__package__': None, 'frexp': , 'factorial': , 'degrees': , 'pi': 3.141592653589793, 'log10': , '__doc__': None, 'math': , 'asinh': , 'fmod': , 'atan': , '__builtins__': , 'copysign': , 'cos': , 'ceil': , 'atan2': , 'isinf': , 'sinh': , '__name__': '__main__', 'trunc': , 'expm1': , 'e': 2.718281828459045, 'tanh': , 'radians': , 'sin': , 'lgamma': , 'erf': , 'erfc': , 'modf': , 'exp': , 'acos': , 'log1p': , 'gamma': }
import X
在引用模块对象的本地名称空间中创建标签。
from X import *
直接在本地名称空间中为X模块的每个成员属性创建标签。
两个操作都将X添加到sys.modules,为true,但对本地命名空间的影响是不同的。
除非你真的知道自己在做什么,否则不应该使用from X import *。您可以从模块X获取与另一个模块甚至您自己的程序中的符号冲突的符号。我对该规则的唯一例外是from math import *。
您可以使用from X import y表单从模块中获取单个内容。
如果使用import X表单,不仅可以明确使用模块X.y,而且如果对模块进行更改并需要重新导入,则现在可以使用reload功能。
有差异,有些简单,有些需要更多解释。
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__属性中列出的所有内容"。这允许模块编写者控制从其模块导出哪些功能和对象。
让我们使用它作为我们模块定义的一个例子
def my_func():
return 1
from import将把所有东西都拉到当前的命名空间中
from X import *
print my_func()
正常导入将在当前命名空间中创建一个名为X的模块对象
import X
print x.my_func()
除了来自X import之外,my_func还可用于仅导入该功能。
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