我确实导入了一个带有名称的模块,并且在没有名称的情况下再次导入它,两者似乎都工作正常,并提供相同的类类型。
>>> from collections import Counter as c
>>> c
<class 'collections.Counter'>
>>> from collections import Counter
>>> Counter
<class 'collections.Counter'>
在python中如何工作,是单个对象指向同一个引用? 另外,为什么以前的名称导入被覆盖或删除。
我也不确定术语
答案 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
是的,c
和Counter
是相同的。两个引用同一对象的变量(名称)。
答案 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
来测试它们是否具有相同的引用。