猿问

如果我将脚本命名为“string.py”或“math.py”,“导入”操作的行为会有所不同。

更新:

情况1:

同一文件夹中的文件:

main.py

string.py

main.py中的代码:

import string

string.py中的代码:

print('Hello!')

运行main.py输出是:你好!

案例二:

同一文件夹中的文件:

main.py

math.py

main.py中的代码:

import math

math.py中的代码:

print('Hello!')

运行main.py输出没什么...

老问题:

如果我将我的脚本命名为“string.py”并将其导入另一个脚本,它会与内置的“string”模块重叠

如果我将我的脚本命名为“math.py”并将其导入另一个脚本,则内置的“数学”会与我自己的重叠

使用内置模块等名称的脚本导入行为取决于我如何命名它们。

一些受影响的模块名称:hashlib、string、calendar

不影响的模块名称:math、cmath、os

来自realpython.com

Python 要做的第一件事是在 sys.modules 中查找名称 abc。这是之前导入的所有模块的缓存。如果在模块缓存中找不到该名称,Python 将继续搜索内置模块列表。这些是 Python 预装的模块,可以在 Python 标准库中找到。如果在内置模块中仍未找到该名称,Python 然后在 sys.path 定义的目录列表中搜索它。

来自 Michael Lutz 的“Learning Python”:

粗略地说,Python 的模块搜索路径是由这些主要组件的串联组成的,其中一些是为您预设的,其中一些您可以定制以告诉 Python 在哪里查找:

  1. 程序的主目录

  2. PYTHONPATH 目录(如果设置)

  3. 标准库目录

  4. 任何 .pth 文件的内容(如果存在)

  5. 第三方扩展的站点包主页

那么现在哪一个是正确的呢?


繁星coding
浏览 102回答 2
2回答

慕哥9229398

math 和 string 的区别在于 math 是用 C 语言编写的,目的是提高速度,而 string 模块是用 Python 编写的,可以在 python lib 目录下找到。因此,当您尝试导入字符串时,本地文件将覆盖全局字符串文件,但是当您尝试导入数学时,Python 不会搜索文件,因为它是内置在 Python 解释器中的。您可以使用以下代码找到所有内置模块的列表:import sys print(sys.builtin_module_names)如果您真的想覆盖数学模块,您可以通过更改sys.modules字典中的值来实现。

犯罪嫌疑人X

我不相信@ZacharyaHaitin 的回答是正确的,而且我很确定如果凯伦真的看到了问题中描述的行为,那么肯定还有其他事情发生。让我们来看一些例子......覆盖string模块我们有一个包含两个文件的空目录:$ lsmain.py string.py该文件main.py包含:$ cat main.pyimport string该文件string.py包含:$ cat math.pyprint('hello')当我们运行时main.py,我们看到:$ python main.pyhello覆盖math模块如果我们对 执行相同的实验math,我们会看到相同的行为。这里是main.py:$ cat main.pyimport math这是math.py:$ cat math.pyprint('hello')当我们运行时main.py,我们看到的行为与我们在前面的示例中看到的相同:$ python main.pyhello上述示例与 Python2 和 Python3 的行为相同。在这两种情况下,都没有必要乱搞sys.modules。这是一个将重现上述示例的脚本:#!/bin/shecho "Overriding string module"cat > main.py << EOFimport stringEOFcat > string.py <<EOFprint('hello')EOFecho "main.py"echo "-------"cat main.pyechoecho "string.py"echo "---------"echocat string.pyechoecho "Running main.py..."python main.pycat <<EOF======================================================================EOFecho "Overriding math module"cat > main.py << EOFimport mathEOFcat > math.py <<EOFprint('hello')EOFecho "main.py"echo "-------"cat main.pyechoecho "math.py"echo "---------"echocat math.pyechoecho "Running main.py..."python main.py
随时随地看视频慕课网APP

相关分类

Python
我要回答