python import from区别_关于python:“import X”和“from X import *”之间的区别?

本问题已经有最佳答案,请猛点这里访问。

在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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值