2009-04-13 125 views
4

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 

這是有問題的。爲什麼ifoo.i更改時不會更改?

+0

輸出如下:10 10 \ n 10 99 – 2009-04-13 16:05:39

+0

這個問題不是很清楚。只需使用foo.i,問題到底是什麼?懶惰? – hasen 2009-04-13 16:09:52

+0

這是一個相當明顯的初學者問題。他希望我在foo.fi()之後成爲99。我認爲他缺少的是模塊的執行。 +1來抵消。 – 2009-04-13 16:21:00

回答

7

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對如何調整你的模塊以達到你想要的有很好的建議。

0

你可以調用一個函數,而不是引用一個全局變量。

8

什麼羅斯說是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 

這也是在這個意義上「更好」是您避免導出全局文件,但仍提供讀取權限。

3

i內部foo.py是從一個在bar.py一個不同i。當bar.py你這樣做:

from foo import i 

,負責創建bar.pyi指的是同一個對象foo.pyi

你的問題是:當你打電話foo.fi()和它說:

i = 99 

那項任務,使foo.pyi一點到另一點整數對象(99)。整數對象本身是不可改變的(幸好),所以它只改變foo.pyi指向的內容。不是bar.pyibar.pyi仍然指向它之前指向的舊對象。 (整數不可變對象10

您可以測試什麼,我在bar.py將以下命令講:

print foo.i 

它應該打印99

+0

很好的解釋。 – 2009-04-13 22:27:13