在python中使用不同的名称导入模块两次

时间:2017-11-15 18:38:45

标签: python python-3.x

我确实导入了一个带有名称的模块,并且在没有名称的情况下再次导入它,两者似乎都工作正常,并提供相同的类类型。

>>> from collections import Counter as c
>>> c
<class 'collections.Counter'>

>>> from collections import Counter
>>> Counter
<class 'collections.Counter'>

在python中如何工作,是单个对象指向同一个引用? 另外,为什么以前的名称导入被覆盖或删除。

我也不确定术语

3 个答案:

答案 0 :(得分:2)

使用python 2.7.13:

>>> from collections import Counter as c
>>> c
<class 'collections.Counter'>
>>> from collections import Counter
>>> Counter
<class 'collections.Counter'>
>>> id(c), id(Counter)
(140244739511392, 140244739511392)
>>> id(c) == id(Counter)
True

是的,cCounter是相同的。两个引用同一对象的变量(名称)。

答案 1 :(得分:1)

我记得,你在python中定义的所有东西都是一个属于一个类的对象。是的,如果一个变量对象分配了一些值,如果你创建另一个具有相同值的变量,那么python不会为第二个变量创建一个新的引用,但它也会使用第一个变量引用第二个变量。

例如:

>>> a=10
>>> id(a)
2001255152
>>> b=20
>>> id(b)
2001255472
>>> c=10
>>> id(c)
2001255152
>>>

我可能不会以更好的方式解释,但我希望我的榜样。

答案 2 :(得分:1)

如果您查看反汇编代码,可以看到它确实加载了同一个对象。 (第2行和第14行)

>>> import dis
>>> codeObj = compile("from collections import Counter as c; from collections import Counter", "foo", "exec")
>>> dis.dis(codeObj)
  1           0 LOAD_CONST               0 (0)
              2 LOAD_CONST               1 (('Counter',))
              4 IMPORT_NAME              0 (collections)
              6 IMPORT_FROM              1 (Counter)
              8 STORE_NAME               2 (c)
             10 POP_TOP
             12 LOAD_CONST               0 (0)
             14 LOAD_CONST               1 (('Counter',))
             16 IMPORT_NAME              0 (collections)
             18 IMPORT_FROM              1 (Counter)
             20 STORE_NAME               1 (Counter)
             22 POP_TOP
             24 LOAD_CONST               2 (None)
             26 RETURN_VALUE

正如其他人所提到的,您可以使用id(c) == id(Counter)c is Counter来测试它们是否具有相同的引用。