2010-01-06 121 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