两次导入一个模块会发生什么? [英] What happens when a module is imported twice?

查看:70
本文介绍了两次导入一个模块会发生什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我怀疑自己是否会被清除.

I have a doubt that I would like to get cleared up.

考虑以下名为ex_1.py的模块:

print("Hello, I'm ex_1")
def greet(name):
 print("Hello, "+name+" nice to meet you! ")

现在考虑另一个名为1_client_ex_1.py的文件,该文件将导入ex_1.py模块.

Now consider another file called 1_client_ex_1.py that will import ex_1.py module.

import ex_1.py

现在,当我执行此文件时,输出为:

Now when I execute this file, I get the output as :

Hello, I'm ex_1

符合预期.

但是当我将1_client_ex_1.py更改为:

import ex_1.py
import ex_1.py

并执行它,它仍然只打印Hello, I'm ex_1一次.它不应该打印两次吗?

and execute it, it still prints only Hello, I'm ex_1 once. Shouldn't it print it twice?

推荐答案

没什么,如果已经导入了模块,则不会再次加载它.

Nothing, if a module has already been imported, it's not loaded again.

您将仅获得对已导入模块的引用(它将来自sys.modules).

You will simply get a reference to the module that has already been imported (it will come from sys.modules).

要获取已导入模块的列表,可以查找sys.modules.keys()(请注意,urllib此处导入了其他模块的 lot 个):

To get a list of the modules that have already been imported, you can look up sys.modules.keys() (note that urllibhere imports a lot of other modules):

>>> import sys
>>> print len(sys.modules.keys())
44
>>> print sys.modules.keys()
['copy_reg', 'sre_compile', '_sre', 'encodings', 'site', '__builtin__', 'sysconfig', '__main__', 'encodings.encodings', 'abc', 'posixpath', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'types', '_codecs', 'encodings.__builtin__', '_warnings', 'genericpath', 'stat', 'zipimport', '_sysconfigdata', 'warnings', 'UserDict', 'encodings.utf_8', 'sys', 'virtualenvwrapper', '_osx_support', 'codecs', 'readline', 'os.path', 'sitecustomize', 'signal', 'traceback', 'linecache', 'posix', 'encodings.aliases', 'exceptions', 'sre_parse', 'os', '_weakref']
>>> import urllib
>>> print len(sys.modules.keys())
70
>>> print sys.modules.keys()
['cStringIO', 'heapq', 'base64', 'copy_reg', 'sre_compile', '_collections', '_sre', 'functools', 'encodings', 'site', '__builtin__', 'sysconfig', 'thread', '_ssl', '__main__', 'operator', 'encodings.encodings', '_heapq', 'abc', 'posixpath', '_weakrefset', 'errno', '_socket', 'binascii', 'encodings.codecs', 'urllib', 'sre_constants', 're', '_abcoll', 'collections', 'types', '_codecs', 'encodings.__builtin__', '_struct', '_warnings', '_scproxy', 'genericpath', 'stat', 'zipimport', '_sysconfigdata', 'string', 'warnings', 'UserDict', 'struct', 'encodings.utf_8', 'textwrap', 'sys', 'ssl', 'virtualenvwrapper', '_osx_support', 'codecs', 'readline', 'os.path', 'strop', '_functools', 'sitecustomize', 'socket', 'keyword', 'signal', 'traceback', 'urlparse', 'linecache', 'itertools', 'posix', 'encodings.aliases', 'time', 'exceptions', 'sre_parse', 'os', '_weakref']
>>> import urllib #again!
>>> print len(sys.modules.keys()) #has not loaded any additional modules
70

让我们旋转一下:

import sys
>>> sys.modules["foo"] = "bar"  # Let's pretend we imported a module named "foo", which is a string.
>>> print __import__("foo")
bar  # Not a module, that's my string!

如您所见,如果在sys.modules中找到了一个模块,您将获得对该模块的新引用.就是这样.

As you can see, if a module is found un sys.modules, you'll just get a new reference to it. That's it.

请注意,这意味着模块在设计时应避免在导入时产生副作用(例如打印内容).

在交互式会话之外重新加载模块通常也不是一个很好的做法(尽管有其用例)-其他答案将详细说明您将如何执行此操作.

Reloading modules, outside of an interactive session, is usually not a very good practice either (although it has its use cases) - the other answers will detail how you'd do this.

这篇关于两次导入一个模块会发生什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆