在python中使用不同名称导入两次模块
我确实导入了一个名为的模块,然后又导入了一个名为的模块,这两个模块似乎都工作得很好,并且给出了相同的类类型在python中使用不同名称导入两次模块,python,python-3.x,Python,Python 3.x,我确实导入了一个名为的模块,然后又导入了一个名为的模块,这两个模块似乎都工作得很好,并且给出了相同的类类型 >>> from collections import Counter as c >>> c <class 'collections.Counter'> >>> from collections import Counter >>> Counter <class 'collections.Count
>>> from collections import Counter as c
>>> c
<class 'collections.Counter'>
>>> from collections import Counter
>>> Counter
<class 'collections.Counter'>
>>作为c从集合导入计数器
>>>c
>>>从收款进口柜台
>>>柜台
这在python中是如何工作的,单个对象指向同一引用吗?
还有,为什么以前的名称导入没有被覆盖或删除呢
我对使用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从集合导入计数器
>>>c
>>>从收款进口柜台
>>>柜台
>>>身份证(c)、身份证(柜台)
(140244739511392, 140244739511392)
>>>id(c)==id(计数器)
符合事实的
是,
c
和计数器
是相同的。引用同一对象的两个变量(名称)。我记得,python中定义的所有对象都属于一个类。是的,如果一个变量对象已经分配了一些值,并且如果您创建了另一个具有相同值的变量,那么python不会为第二个变量创建一个新的引用,但是它也会为第二个变量使用第一个变量引用
例如:
>>> a=10
>>> id(a)
2001255152
>>> b=20
>>> id(b)
2001255472
>>> c=10
>>> id(c)
2001255152
>>>
我可能不会用更好的方式来解释,但我希望我的例子能做到 如果查看反汇编代码,您可以看到它确实加载了相同的对象。(第2行和第14行)
正如其他人所提到的,你可以使用
id(c)=id(Counter)
或c is Counter
来测试它们是否有相同的引用。“还有为什么以前的名称导入没有被覆盖或删除”为什么应该这样做?@Rawing我只是在想,当我们再次导入相同的东西时,前面的参考也应该删除。我想我错了。Python不知道或者不关心您已经用不同的名称导入了模块。如果你想去掉旧名字,这就是del
语句的作用。请记住,如果数字较大,这将不起作用。
>>> 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