簡體   English   中英

Python導入:在“父”/其他孩子中改變“child”中的變量會改變變量嗎?

[英]Python imports: Will changing a variable in “child” change variable in “parent”/other children?

假設你有3個模塊,a.py,b.py和c.py:

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:重置你的大腦

from ... import *表單主要用於解釋器提示下的便捷交互式使用:建議您不要在其他情況下使用它,因為它只會給您帶來問題。

實際上,我的雇主的內部風格指南更進一步,建議始終導入模塊,從不在模塊內的內容(包內的模塊是可以的,事實上推薦)。 因此,在我們的代碼庫中,對導入內容的引用始終是限定名稱( themod.thething ),而不是半名(總是指內置,同一模塊的全局或本地); 這使代碼更清晰,更易讀,並避免各種微妙的異常。

當然,如果模塊的名稱太長,導入中的as子句,為了導入模塊的目的,為它提供更短更方便的別名,就可以了。 但是,使用您的單字母模塊名稱,將不需要;-)。

因此,如果您遵循指南並始終導入模塊(而不是導入模塊中的內容),則c.v1將始終引用與a.v1b.v1相同的b.v1 ,這兩者都用於獲取AND設置:這是一個潛力馬上就避免了微妙的異常! - )

記住Python的最后一點(在解釋器提示符下import this它以查看全部內容):

Namespaces are one honking great idea -- let's do more of those!

導入整個模塊(而不是從其中的位和碎片)保留其作為命名空間的完整性,就像通過限定(點綴)名稱一樣引用導入模塊內的東西一樣。 這是一個很棒的主意:做更多的事情! - )

是的,你只需要正確訪問它(並且不要使用import *,這是邪惡的)

c.py:

import a
print a.v1 # prints 1
a.v1 = 0
print a.v1 # prints 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM