亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果我將腳本命名為“string.py”或“math.py”,“導入”操作的行為會有所不同。

如果我將腳本命名為“string.py”或“math.py”,“導入”操作的行為會有所不同。

繁星coding 2022-06-22 16:30:47
更新:情況1:同一文件夾中的文件:main.pystring.pymain.py中的代碼:import stringstring.py中的代碼:print('Hello!')運行main.py輸出是:你好!案例二:同一文件夾中的文件:main.pymath.pymain.py中的代碼:import mathmath.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 在哪里查找:程序的主目錄PYTHONPATH 目錄(如果設置)標準庫目錄任何 .pth 文件的內容(如果存在)第三方擴展的站點包主頁那么現在哪一個是正確的呢?
查看完整描述

2 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

math 和 string 的區別在于 math 是用 C 語言編寫的,目的是提高速度,而 string 模塊是用 Python 編寫的,可以在 python lib 目錄下找到。

因此,當您嘗試導入字符串時,本地文件將覆蓋全局字符串文件,但是當您嘗試導入數學時,Python 不會搜索文件,因為它是內置在 Python 解釋器中的。

您可以使用以下代碼找到所有內置模塊的列表:

import sys
print(sys.builtin_module_names)

如果您真的想覆蓋數學模塊,您可以通過更改sys.modules字典中的值來實現。


查看完整回答
反對 回復 2022-06-22
?
犯罪嫌疑人X

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


查看完整回答
反對 回復 2022-06-22
  • 2 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號