出人意料的智能python导入行为:引擎盖下发生了什么?

出人意料的智能python导入行为:引擎盖下发生了什么?,python,python-3.x,import,python-import,Python,Python 3.x,Import,Python Import,Python导入是,但我认为我最终理解了它们,直到我在3.9.1中偶然发现了这种行为。这里发生了什么 以这个包结构为例: countries/ ├── __init__.py # from . import greece ├── greece.py └── spain.py 如果我真的进口了一些国家,那么这些国家只包括希腊,这是意料之中的 但如果我以以下内容开始我的课程: from countries import spain import countries 这些国家包括希腊和西班牙 我

Python导入是,但我认为我最终理解了它们,直到我在3.9.1中偶然发现了这种行为。这里发生了什么

以这个包结构为例:

countries/
├── __init__.py  # from . import greece
├── greece.py
└── spain.py
如果我真的进口了一些国家,那么这些国家只包括希腊,这是意料之中的

但如果我以以下内容开始我的课程:

from countries import spain
import countries
这些国家包括希腊和西班牙


我知道当我进行第一次导入时,_init__u;py是在后台运行的。我不明白的是python如何记得将希腊和西班牙都包括在国家名称空间中。运行“从国家/地区导入西班牙”后,是否会将国家/地区名称空间保存在引擎盖下的某个位置,然后运行“导入国家/地区”只是将其添加到本地名称空间?

您是正确的。导入模块时,python会将其保存在导入模块的列表中。当您从国家导入西班牙,然后导入根时,python知道西班牙是父国家的子模块。因此,当您导入国家/地区时,它只是将您不需要的子模块添加到父模块中


有关实际逻辑,请参见此处:

您是正确的。导入模块时,python会将其保存在导入模块的列表中。当您从国家导入西班牙,然后导入根时,python知道西班牙是父国家的子模块。因此,当您导入国家/地区时,它只是将您不需要的子模块添加到父模块中


请参见此处了解实际逻辑:

您可以随时打印sys.path来查看导入。如果您有时间,David Beazley的这篇演讲是我最喜欢的python软件包介绍之一。真的很有趣,谢谢!您可以随时打印sys.path来查看导入。如果您有时间,David Beazley的这篇演讲是我最喜欢的python软件包介绍之一。真的很有趣,谢谢!