2016-11-09 45 views
0

我有一個模塊代碼:作用域在Python模塊

X = 88 
def f(): 
    global X 
    X = 99 

而另一個文件使用這個模塊:

from First import X,f 
X = 11 
f() 
print(X) 

現在按照我的理解,因爲我們明確地輸入符號x和f他們應該成爲導入模塊名稱空間的一部分。

而且由於函數f改變了全局X.答案應該是99

但是,這似乎並不如此,因爲輸出是11

請幫助我瞭解爲什麼?

回答

7

通過使用from module import ...語法,您可以創建新的名稱,這些名稱與原始模塊中的名稱綁定到相同的對象。這些名字是獨立

導入之後你有這樣的:

First.X ----\ 
      |--> 88 
another.X --/ 

然後,設置another.X11,讓你有這樣的:

First.X --------> 88 

another.X ------> 11 

和你打電話f()後,你有這樣的:

First.X --------> 99 

another.X ------> 11 

您可以改爲輸入只需該模塊;結合名稱First指向模塊對象:

import First 
first.X = 11 
first.f() 
print(first.X) 

現在,所有的代碼上First.X才能使用。

您可能想要了解如何Python names and objects work

+0

非常感謝。因此,基本上使用from語句(來自 import *)意味着我們可以使用導入模塊中的對象,而不用模塊名稱對它們進行限定。但是對於所有的實際用途來說,這只是寫入import

+0

@SubhayanBhattacharya:'從模塊導入*'在'module'中爲每個可用名稱在命名空間中創建新名稱(可用取決於'module .__ dir__'如果沒有'module .__ dir__',''name name [dir(module)if name [0]!='_']'。 –

+0

@SubhayanBhattacharya:另一方面,'import module'只在名字空間中設置名稱'module'。而已。所以不,這是不正確的,'import module'與'from module import *'完全不同。 –