在Python中,命名空间(namespace)是一个字典,用于将名称与对象关联。命名空间的级别有:局部、全局、内置。模块是组织代码的独立空间。在导入时,Python为每个模块创建一个新的命名空间。
import module — 导入模块,并通过module.name访问对象。from module import name — 直接将对象从模块导入当前命名空间(存在命名冲突的风险)。as — 允许指定别名。为了避免命名冲突:
import mymodule),而不是星号(from... import *)。__init__.py的目录)组织项目。import module as m)。project/
package/
__init__.py
module1.py
module2.py
import package.module1 from package.module2 import function as fn
问题: 导入模块两次有什么区别?模块的所有代码会重复执行吗?
答案: 不会。首次导入时,模块会执行,并将结果缓存到sys.modules中。重复导入会返回已经加载的模块对象,其代码不会再次执行。
# module.py print('Hello!') # main.py import module # 会输出 Hello! import module # 不会输出任何内容
故事
from settings import *,结果在更改设置时意外地"覆盖"了局部变量,引发了难以发现的bug。故事
utils.py)的模块。在集成阶段,"相同"名称的模块互相"替换",导致意外行为和复杂的bug。故事
在一个库中尝试通过importlib.reload"热重载"具有新设置的模块。没有考虑到已导入的其他模块保持对对象的旧链接,因此更改未在应用程序的所有部分生效。