Python: почему не обновляются переменные? - PullRequest
0 голосов
/ 06 января 2010

Программа Python, которую я отлаживаю, имеет следующий код (включая print операторы для отладки):

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 на компьютере с Ubuntu Jaunty.)

Ответы [ 3 ]

6 голосов
/ 06 января 2010

Если значения целые, то (oup2008 / ouptotal) будет равно нулю, поэтому они будут обновлены до их собственного значения + 0, следовательно, без изменений.

Преобразуйте их в числа с плавающей точкой для расчета, затем верните, если требуется, и все должно работать как положено.

Пример:

oup["2008"] = oup2008 + int(oup0 * (float(oup2008) / ouptotal))
3 голосов
/ 06 января 2010

Целочисленное деление приводит к целочисленным результатам. либо используйте float() на одном из условий деления, либо добавьте from __future__ import division вверху.

1 голос
/ 06 января 2010

Они есть, вы просто обновляете их с тем же значением. В Python 2.6 / по-прежнему является целочисленным оператором деления ( ссылка ), поэтому при делении (oup2008 / ouptotal) число делится на большее число, что всегда приводит к нулю. Если вам нужно поведение из более поздних версий, где / является оператором с плавающей запятой, вы можете получить его с помощью будущего оператора, импортирующего division.

...