在 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
, true,但是对本地命名空间的影响是不同的。
存在差异,有些很简单,有些则需要更多解释。
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
表单,您不仅可以显式使用模块,而且如果您对模块进行更改并需要重新导入它,X.y
您现在可以使用该功能。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 import 会将所有内容拉入当前命名空间
from X import *
print my_func()
正常导入将在当前命名空间中创建一个名为 X 的模块对象
import X
print x.my_func()
此外 from X import my_func 可用于仅导入该功能。