我是一名matlab程序员,并且已经涉足各种各样的东西。 python中的一个非常基本的概念/事物,我还没有涉及到from和import语句。
当我从bitarray模块导入bitarray时(我正确地说这个吗?)使用示例1)当我想在后面的脚本中使用它们时,我只是调用它的方法。但是,当我导入numpy我不能使用2)中显示的代码,因为它抛出一个错误,我必须使用3)中的语句然后键入np。在使用任何方法之前,这是有道理的。我也可以使用我在下面4)中显示的similer语法导入bitarray .......为什么2)在1)时不起作用?我正在祈祷一个简单的解释:) .....
1)
from bitarray import bitarray
2)
from numpy import numpy
3)
import numpy as np
4)
import bitarray as pp
答案 0 :(得分:3)
这是由于bitarray
和numpy
之间的不同包结构造成的;具体来说,一个包含一个与模块本身同名的对象,另一个不包含。
bitarray
模块包含一个名为bitarray
的类(类似地,对于该示例,标准库中的datetime
模块包含datetime
类)。因此,以下内容是等效的:
from bitarray import bitarray
ba = bitarray(...)
和
import bitarray
ba = bitarray.bitarray(...)
在前者我们import
类 bitarray
直接从模块进入当前命名空间;在后者中,我们将整个模块导入为bitarray
,并需要通过指定模块命名空间来访问该类。
相比之下,numpy
不包含名为numpy
的对象,因此
from numpy import numpy
不起作用。
as
是分开的;这简单地允许您为您要导入的任何内容提供别名,因此以下任何一种都可以正常工作:
import numpy as np
a = np.array(...)
from bitarray import bitarray as pp
b = pp(...)
import bitarray as pp
b = pp.bitarray(...)
如上面的mauve
条评论,您可以使用*
"通配符导入"导入所有内容,所以:
from numpy import *
from bitarray import *
会将两个模块中的每个顶级名称导入当前名称空间。之后,例如
a = array(...)
b = bitarray(...)
两者都可以。但是,这是not recommended,因为它通常是一个坏主意 - 例如,numpy
contains a definition of all
如果导入所有内容,它将影响同名的内置函数。
此外,对于任何阅读代码的人(包括您的更高版本!)来说,要弄清楚所使用的类和函数来自何处都会变得更加困难。比较:
from numpy import *
from random import *
a = choice([1, 2, 3]) # which module did choice come from?
b = all(x == y for x in l) # is this numpy's all or the built-in?
更清楚:
import numpy as np
import random
a = random.choice([1, 2, 3]) # clearly from random
b = all(x == y for x in l) # must be the built-in, not np.all()
答案 1 :(得分:1)
1)如果bitarray
是库 bitarray
中的功能或类名称,那么它就完美了有效。
2)这没有意义,因为numpy
没有名为numpy
的函数。
3)这很好,因为您正在导入库并为其分配别名。
4)这也很好,因为你只需要在别名下导入。