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
添加回答
舉報