2011-04-13 49 views
0

我在python程序中使用线程,最近发现一个问题,其中的float没有被正确解释,并且每当我打印出pdb或日志语句时,它大部分时间显示正确。Python变量在pdb和打印语句中的评估方式不同

奇怪的是,在刚刚运行的这两个线程中显示的打印量不同。另外,前两个打印使用相同的格式,但该值仍处于线程更改1.

for x in imports: 
    if float(x.prob) == 0.0: 
     logging.debug(float(x.prob)) 
     logging.debug(float(x.prob)) 
     logging.debug(x.prob) 
     logging.debug(str(x.prob)) 
     logging.debug(str(float(x.prob))) 
     import pdb; pdb.set_trace() 

[DEBUG] (Thread-1 ) 0.0 
[DEBUG] (Thread-1 ) 0.0592 
[DEBUG] (Thread-1 ) 0.0592 
[DEBUG] (Thread-1 ) 0.0592 
[DEBUG] (Thread-1 ) 0.0592 
[DEBUG] (Thread-2 ) 0.0 
[DEBUG] (Thread-2 ) 0.0 
[DEBUG] (Thread-2 ) 0 
[DEBUG] (Thread-2 ) 0.0592 
[DEBUG] (Thread-2 ) 0.0592 

(Pdb) float(x.prob) == 0.0 
False 

的原因是什么? 我能做些什么,所以第一次正确解释它?

这个问题类似:https://stackoverflow.com/questions/2485338/pdb-show-different-variable-values-than-print-statements

+0

需要一个完整的,可运行的程序来演示这个问题,如果没有完整的图片来调试线程化的奇怪程序是非常困难的。我们甚至不知道“进口”是什么或来自哪里。 – 2011-04-13 05:11:37

回答

0

它相当不可能从你贴什么告诉。浮动不会随机地从0.0切换到〜0.05,某些内容正在改变存储在该内存位置(变量)中的值。你是否设置了其他线程的值?

另外,请注意,在您的演示代码中,如果您从一开始就寻找x.prob的值为0.0592,它将会在if语句中失败相等性测试,并且从不触发您的打印语句。

+0

我没有改变另一个线程的值(有意),我从不期望它等于0,它应该总是有一个正值,并且永远不会触发打印语句。我会检查一下价值是否会发生变化。 – jonvon 2011-04-13 05:04:43

+0

是的,主线程必须改变它的值,现在看起来很明显。 – jonvon 2011-04-13 05:12:42