2011-04-13 52 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