2017-06-19 79 views
3

我在模塊1聲明的函數改變:不能變量從導入模塊

from shared import * 
def foo(): 
    global a 
    print('in :',a) 
    a=0 
    print('out:',a) 

而且共享模塊:

a=1 

所以我推出python3解釋和:

>>> from module1 import * 
>>> a 
1 
>>> foo() 
in : 1 
out: 0 
>>> a 
1 

W hy a還是1?

回答

2

人,我非常確信這個問題應該已經有了答案,但我似乎無法找到它。那麼,在這裏,你去:

from shared import *shared模塊導入所有(導出)字段到當前名稱空間。它通過遍歷模塊中的字段並將變量分配到與模塊中名稱相同的當前名稱空間中。

>>> dir() 
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__'] 
>>> from shared import * 
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'a'] 

請注意,我們當前的命名空間現在包含一個名爲a的變量。

儘管ashared.a(作爲導入)具有相同的值,但兩者之間沒有進一步的聯繫。如果您在命名空間中重新分配a,則這對導入的模塊沒有影響。

事實上,如果你的名字從模塊拉再次,您將覆蓋本地值:

>>> a = 5 
>>> a 
5 
>>> from shared import a 
>>> a 
1 
+0

謝謝你解釋清楚! 那麼我該如何處理呢?拒絕使用'import *'並使用'shared.a'來代替? – Iliaspice

+1

@Iliaspice如果你想重新分配'shared.a',這基本上是你唯一的選擇。 – dhke