foo.py:python中的導入是靜態的,任何解決方案?
i = 10
def fi():
global i
i = 99
bar.py:
import foo
from foo import i
print i, foo.i
foo.fi()
print i, foo.i
這是有問題的。爲什麼i
在foo.i
更改時不會更改?
foo.py:python中的導入是靜態的,任何解決方案?
i = 10
def fi():
global i
i = 99
bar.py:
import foo
from foo import i
print i, foo.i
foo.fi()
print i, foo.i
這是有問題的。爲什麼i
在foo.i
更改時不會更改?
import
確實在bar.py
什麼是建立在bar.py
模塊命名空間中指向相同的地址作爲foo.py
模塊命名空間稱爲i
標識符稱爲i
的標識符。
這是一個重要的區別... bar.i
沒有指向foo.i
,而是在物體10
被認爲foo.i
發生在同一時間指向內存中的同一個空間。在python中,變量名不是內存空間......它們是指向內存空間的標識符。當你在bar中導入時,你正在設置一個本地命名空間標識符。
您的代碼按預期運行,直到foo.fi()
被調用,當命名空間foo.py標識符i
被改變爲指向文字99,它是一個對象在內存在明顯不同的位置比10.現在該模塊foo
的級別名稱空間字典具有i
在bar.py中標識內存中的標識爲i
的不同對象。
Shane和rossfabricant對如何調整你的模塊以達到你想要的有很好的建議。
你可以調用一個函數,而不是引用一個全局變量。
什麼羅斯說是restucture FOO像這樣:
_i = 10
def getI():
return _i
def fi():
global _i
_i = 99
然後你會看到它的工作原理,你想要的方式:
>>> import foo
>>> print foo.getI()
10
>>> foo.fi()
>>> print foo.getI()
99
這也是在這個意義上「更好」是您避免導出全局文件,但仍提供讀取權限。
i
內部foo.py
是從一個在bar.py
一個不同i
。當bar.py
你這樣做:
from foo import i
,負責創建bar.py
新i
是指的是同一個對象在foo.py
的i
。
你的問題是:當你打電話foo.fi()
和它說:
i = 99
那項任務,使foo.py
的i
一點到另一點整數對象(99
)。整數對象本身是不可改變的(幸好),所以它只改變foo.py
的i
指向的內容。不是bar.py
的i
。 bar.py
的i
仍然指向它之前指向的舊對象。 (整數不可變對象10
)
您可以測試什麼,我在bar.py
將以下命令講:
print foo.i
它應該打印99
。
很好的解釋。 – 2009-04-13 22:27:13
輸出如下:10 10 \ n 10 99 – 2009-04-13 16:05:39
這個問題不是很清楚。只需使用foo.i,問題到底是什麼?懶惰? – hasen 2009-04-13 16:09:52
這是一個相當明顯的初學者問題。他希望我在foo.fi()之後成爲99。我認爲他缺少的是模塊的執行。 +1來抵消。 – 2009-04-13 16:21:00