2010-01-06 143 views
0

一個Python程序,我調試具有下面的代碼(包括print報表調試):Python:爲什麼變量沒有更新?

print "BEFORE..." 
print "oup[\"0\"] = " + str(oup["0"]) 
print "oup[\"2008\"] = " + str(oup["2008"]) 
print "oup[\"2009\"] = " + str(oup["2009"]) 

oup0 = oup["0"] 
oup2008 = oup["2008"] 
oup2009 = oup["2009"] 
ouptotal = oup2008 + oup2009 
print "ouptotal = " + str(ouptotal) 

if ouptotal > 0: 
    oup["2008"] = oup2008 + oup0 * (oup2008/ouptotal) 
    oup["2009"] = oup2009 + oup0 * (oup2009/ouptotal) 

print "AFTER..." 
print "oup[\"0\"] = " + str(oup["0"]) 
print "oup[\"2008\"] = " + str(oup["2008"]) 
print "oup[\"2009\"] = " + str(oup["2009"]) 

,直到這一點,變量更新正確。當我運行的代碼,我得到的屏幕上顯示如下:

BEFORE...                  
oup["0"] = 22032                 
oup["2008"] = 541                
oup["2009"] = 15223                
ouptotal = 15764                 
AFTER...                   
oup["0"] = 22032                 
oup["2008"] = 541                
oup["2009"] = 15223                

爲什麼不OUP [ 「2008」]和OUP [ 「2009」]更新?

(Python版本是2.6.2一個「Jaunty的」 Ubuntu的機器上。)

+0

從有意*學習Python的人的角度來看,有一天,'oup [2008]'與'oup [「2008」]'一樣嗎? – pavium 2010-01-06 02:18:37

+1

編號int索引和str索引是不同的。 – 2010-01-06 02:20:08

+0

我刪除了打印的「oup [2008]」,因爲它可能令人困惑。 – 2010-01-06 02:21:44

回答

6

如果值是整數,那麼(oup2008/ouptotal)將爲零,所以他們將被更新到自己的價值+ 0,因此沒有更改。

將它們轉換爲浮點數進行計算,然後返回,如果需要,它應該按預期工作。

實施例:

oup["2008"] = oup2008 + int(oup0 * (float(oup2008)/ouptotal)) 
+0

這樣做!謝謝! – 2010-01-06 02:20:46

3

整數除法結果的整數結果。在其中一個分部條款上使用float()或在頂部添加from __future__ import division

1

他們是,你只是用相同的值更新它們。在Python 2.6中,/仍然是一個整數除法運算符(reference),因此將(oup2008/ouptotal)除以一個更大的數字,結果總是爲零。如果你想要更高版本的行爲,那麼/是一個浮點運算符,你可以通過將來的語句導入division來得到它。

+0

感謝您的參考。 – 2010-01-06 02:26:30