2 回答
TA贡献1877条经验 获得超6个赞
math 和 string 的区别在于 math 是用 C 语言编写的,目的是提高速度,而 string 模块是用 Python 编写的,可以在 python lib 目录下找到。
因此,当您尝试导入字符串时,本地文件将覆盖全局字符串文件,但是当您尝试导入数学时,Python 不会搜索文件,因为它是内置在 Python 解释器中的。
您可以使用以下代码找到所有内置模块的列表:
import sys print(sys.builtin_module_names)
如果您真的想覆盖数学模块,您可以通过更改sys.modules
字典中的值来实现。
TA贡献2080条经验 获得超4个赞
我不相信@ZacharyaHaitin 的回答是正确的,而且我很确定如果凯伦真的看到了问题中描述的行为,那么肯定还有其他事情发生。
让我们来看一些例子......
覆盖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。
这是一个将重现上述示例的脚本:
#!/bin/sh
echo "Overriding string module"
cat > main.py << EOF
import string
EOF
cat > string.py <<EOF
print('hello')
EOF
echo "main.py"
echo "-------"
cat main.py
echo
echo "string.py"
echo "---------"
echo
cat string.py
echo
echo "Running main.py..."
python main.py
cat <<EOF
======================================================================
EOF
echo "Overriding math module"
cat > main.py << EOF
import math
EOF
cat > math.py <<EOF
print('hello')
EOF
echo "main.py"
echo "-------"
cat main.py
echo
echo "math.py"
echo "---------"
echo
cat math.py
echo
echo "Running main.py..."
python main.py
添加回答
举报