假設你有3個模塊,a.py,b.py和c.py:Python導入:將在「父」/其他孩子中更改「孩子」變量中的變量嗎?
a.py:
v1 = 1
v2 = 2
etc.
b.py:
from a import *
c.py :
from a import *
v1 = 0
c.py會在a.py和b.py中更改v1嗎?如果沒有,是否有辦法做到這一點?
假設你有3個模塊,a.py,b.py和c.py:Python導入:將在「父」/其他孩子中更改「孩子」變量中的變量嗎?
a.py:
v1 = 1
v2 = 2
etc.
b.py:
from a import *
c.py :
from a import *
v1 = 0
c.py會在a.py和b.py中更改v1嗎?如果沒有,是否有辦法做到這一點?
所有這一切如下語句:
v1 = 0
可以做名稱v1
被綁定到該對象0
。它不能影響不同的模塊。
如果我在那裏使用不熟悉的術語,我想我可能是,我強烈建議您閱讀Fredrik Lundh的優秀文章Python Objects: Reset your brain。
是的,你只需要正確地訪問它(和不使用進口*,它是邪惡的)
c.py:
import a
print a.v1 # prints 1
a.v1 = 0
print a.v1 # prints 0
的from ... import *
形式基本上是用於方便的交互使用在口譯員提示下:你最好不要在其他情況下使用它,因爲它只會給你帶來問題。
事實上,內部風格指南,在我的僱主更進一步,建議總是導入模塊,從模塊中(模塊推薦從內包裝是OK,實際上)從來沒有的內容。因此,在我們的代碼庫中,對導入的東西的引用始終是限定名稱(themod.thething
),而不是裸數據名(它始終指內置的,同一模塊的全局變量或本地數據)。這使得代碼更清晰,更具可讀性,並避免了各種細微的異常。
當然,如果一個模塊的名字太長,導入中的一個as
子句,爲了導入模塊的目的而給它一個更短和更方便的別名就沒有問題。但是,用您的單字母模塊名稱,這將不需要;-)。
所以,如果你遵循的方針,始終導入模塊(而不是從它裏面的東西),c.v1
將始終指同樣的事情a.v1
和b.v1
,無論是用於獲取和設置:這裏有一個潛在的微妙異常避免了蝙蝠的權利 - )
記住的Python(做import this
在提示符的解釋,看到這一切)的禪的最後一點:
Namespaces are one honking great idea -- let's do more of those!
導入整個模塊(未位,從它內部的作品)保留其完整性amespace,正如通過合格(虛線)名稱引用導入模塊中的東西一樣。這是一個鳴喇叭偉大的想法:做更多的是 - )
所以你永遠不會「從datetime導入日期時間」;你總是導入日期時間,並且每次輸入「datetime.datetime」?這是一個糟糕的風格指南。 –
@Glenn,對你的問題,「是」;根據您的意見,我不知道任何Python風格指南都被更多的Python提交者(包括Guido ;-)主動接受(並通過「可讀性評論」強制執行),而我們的Python SW似乎相當成功(包括時間市場,可維護性,性能[cfr YouTube,基於Python和快速]等),所以我想知道你基於哪種經驗數據。是的,PEP 8確實接受「導入課程」,但Guido寫道,在他加入Google之前,遇到(並接受並強制執行)我們的真棒指導! - ) –
寫作「datetime.datetime」非常醜陋; 「datetime.datetime.now」更醜陋;鼓勵醜陋代碼的編碼風格很糟糕。更廣泛地說,當模塊本身是名稱空間時,將模塊作爲名稱空間是無用的。導入作爲命名空間的級別 - 對於許多模塊,這是模塊本身,但對於像datetime這樣的類,它是類。 –