2010-10-30 98 views
2

我有一個樣本代碼看起來像這樣,值(位置= 2,object.position = 3):奇怪python的比較行爲

new_position = position 
    old_position = object.position  

    logging.debug("1. new_position: %s, old_position: %s" % (new_position, old_position)) 

    if old_position != new_position: 
     logging.debug("old position other than new position") 
     if new_position > old_position: 
      logging.debug("Why am I here ?") 

現在調試:

DEBUG 1. new_position: 2, old_position: 3 
DEBUG 2. old position other than new position 
DEBUG Why am I here? 
+1

將'%s'說明符更改爲'%r',然後發佈輸出。 – Omnifarious 2010-10-30 18:24:35

+2

順便說一句,你不應該使用'object'這個名字,因爲它指的是內置類型的'object',它可能會混淆你的程序 – 2010-10-30 18:28:11

回答

4

這可能是因爲您正在比較不同的不兼容類型(例如字符串和整數)。如果是這樣,那麼順序取決於類型名稱的字母順序。

>>> '2' > 3 
True 

這適用於Python 2.x.在Python 3.x中,這會引發TypeError

+0

當然我在提交帖子後想過它。無論如何thx! – mastodon 2010-10-30 18:39:52

+1

@mastodon - 恕我直言,當你嘗試着去轉換成字符串(又名'str'或'%s)時,最好總是打印出'repr'(又名'%r'),而不是(或除此之外)調試東西。 – Omnifarious 2010-10-30 21:43:46

-2

假設理智的比較操作,old_position != new_position相當於old_position < new_position or old_position > new_position

2

你肯定old_positionnew_position是整數?當使用%s ...即使它們以完全不同的方式實現比較時,任何對象都可以打印'2''3'

改爲嘗試%r