2014-02-24 153 views
1

假設我有一個Python中的模塊foo,它具有函數bar()和模塊x = 'spam'中的全局變量。 bar()使用此x進行操作。Python模塊範圍

如果我導入foo就像import foo,然後撥打foo.bar(),這很明顯會發生什麼。

但是,如果我輸入bar()僅是這樣的:from foo import bar,我叫bar(),會發生什麼,如果我也有我的全局命名空間的變量x

foo.py

x = 'spam' 
def bar(): 
    print x 

main.py

from foo import bar 
x = 'eggs' 
bar() 

如果我這個替代進口線:from foo import bar, x

編輯:(在這兩個情況下,它打印「垃圾郵件」,問題是爲什麼呢?)

+0

你爲什麼不試試看? –

+0

我做到了,很明顯,我對此感興趣。 :) – Mkoch

+0

來自foo import x的語句查找'foo.x'的值,並將'main'的局部名稱空間中的'x'綁定到它找到的值。變量'foo.x'和'main.x'是** distinct **,但碰巧保持相同的值。爲其中一個分配不同的值不會影響另一個值。 [我不能將此作爲答案發布,因爲問題已關閉]。 – tom

回答

0

from foo import bar進口富(無參考),並創建參考foo.bar

bar本地bar有沒有辦法看到main.x


的你可以做一個類似這樣的事:

import foo 
bar = foo.bar 
del foo 

(除非你已經有一個名爲foo一個對象,它現在已經不復存在了)

1

函數是在創建時保持約自理的各種信息的對象。 檢查bar.__module__bar.__globals__的值,它很明顯是如何工作的。