UPDATED:
情况1:
同一文件夹中的文件:
main.py
string.py
main.py中的代码:
import string
string.py中的代码:
print('Hello!')
正在运行main.py输出是:Hello!
案例2:
同一文件夹中的文件:
main.py
math.py
main.py中的代码:
import math
math.py中的代码:
print('Hello!')
正在运行main.py输出为空...
旧问题:
如果我将脚本命名为'string.py'并将其导入另一个脚本,则它将与内置的'string'模块重叠
如果我将脚本命名为'math.py'并将其导入另一个脚本,则内置的'math'与我自己的脚本重叠
具有内置模块之类名称的脚本导入行为取决于我如何命名它们。
受影响的某些模块名称:hashlib,字符串,日历
不影响的模块名称:数学,数学,操作系统
Python要做的第一件事是在sys.modules中查找名称abc。这是先前已导入的所有模块的缓存。如果在模块缓存中找不到该名称,Python将继续搜索内置模块列表。这些是模块预先安装了Python,可以在Python标准中找到图书馆。如果在内置模块中仍找不到该名称,则使用Python然后在sys.path定义的目录列表中搜索它。
摘自Michael Lutz的“学习Python”:
大致来说,Python的模块搜索路径由串联组成这些主要组件中的一部分,其中一些是为您预先设置的,另一些是您可以定制其中的哪些内容来告诉Python查找位置:
程序的主目录
PYTHONPATH目录(如果已设置)
标准库目录
任何.pth文件的内容(如果存在)
第三方扩展的站点程序包主页
那么现在哪个是正确的?
[数学和字符串之间的区别是,数学是用C语言编写的,以提高速度,而字符串模块是用Python编写的,可以在python lib目录下找到。
因此,当您尝试导入字符串时,本地文件将覆盖全局字符串文件,但是当您尝试导入数学时,Python不会搜索文件,因为它是内置在Python解释器中的。
您可以使用以下代码找到所有内置模块的列表:
import sys
print(sys.builtin_module_names)
如果您真的想覆盖数学模块,则可以通过更改sys.modules
字典中的值来实现。
我不相信@ZacharyaHaitin的回答是正确的,而且我非常确定,如果凯伦(Karen)确实看到问题中描述的行为,那么肯定还会有其他事情发生。
让我们看一些例子...
string
模块我们有一个空目录,其中包含两个文件:
$ ls
main.py string.py
文件main.py
包含:
$ cat main.py
import string
文件string.py
包含:
$ cat math.py
print('hello')
当我们运行main.py
时,我们看到:
$ python main.py
hello
math
模块如果我们对math
执行相同的实验,则会看到相同的行为。这是main.py
:
$ cat main.py
import math
这里是math.py
:
$ cat math.py
print('hello')
[当我们运行main.py
时,我们看到的行为与前面示例中看到的行为相同:
$ python main.py
hello
以上示例在Python2和Python3中的行为相同。在任何情况下,都不需要用sys.modules
来捣乱。