Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用不同名称导入两次模块_Python_Python 3.x - Fatal编程技术网

在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