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

2024-03-29 10:14:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我确实导入了一个有名称的模块,然后又导入了一个没有名称的模块,这两个模块似乎都工作得很好,并且给出了相同的类类型。你知道吗

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

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

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

我也不确定术语


Tags: 模块对象fromimport名称类型ascounter
3条回答

我记得,在python中定义的所有对象都属于一个类。是的,如果一个variable对象已经赋值,如果您创建了另一个具有相同值的变量,那么python不会为第二个变量创建一个新的引用,但是它也会为第二个变量使用第一个variables引用。你知道吗

例如:

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

我也许不能用更好的方式来解释,但我希望我的例子能做到。你知道吗

如果查看反汇编代码,可以看到它确实加载了同一个对象。(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来测试它们是否具有相同的引用。你知道吗

使用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是一样的。引用同一对象的两个变量(名称)。你知道吗

相关问题 更多 >