if语句被跳过/忽略

时间:2013-10-28 00:02:19

标签: python if-statement

当我运行此代码时,食物就像-5一样,它似乎完全跳过if语句并转到函数的下一部分(我只有下面的部分)

def change_location():
global food
global units
global SP
if food < 0: #problem seems to be here
        print '------------------------------------------------------'
        print 'not enougth food'
        main()

这个概念是,如果你没有食物,你就不能去一个新的地方。我不介意替代这个。

2 个答案:

答案 0 :(得分:5)

确保food不是字符串,因为在CPython2中,'-5' < 0为假:

>>> '-5' < 0
False

您可以通过在if语句之前放置一个断言来测试代码中是否存在这个问题:

assert not isinstance(food, basestring)
if food < 0:
    ...

如果food是字符串(或unicode),则程序在到达AssertionError语句时会停止assert

如果确实food是一个字符串,则需要找出问题的根源。当您发现food被定义为字符串的位置时,您可以使用int函数将该字符串转换为int:

food = int(...)

当然,您甚至可以在条件中使用int

if int(food) < 0:

但如果food打算成为int,那么这将是一种草率的编程方式。


来自the CPython2 docs

  

CPython实现细节:除了以外的不同类型的对象   数字按其类型名称排序;相同类型的对象   不支持正确比较的,按其地址排序。

因此,由于单词'float'按字母顺序排在'string'之前,因此所有浮点数的排序均低于任何字符串。

在Python3中,比较不同类型的对象引发了一个TypeError,从而消除了这个陷阱。

答案 1 :(得分:3)

可能@ubuntu是正确的。这里有一些调试此类事情的快速提示

添加打印声明

print food
if food < 0: #problem seems to be here

问题是-5"-5"打印完全相同。添加repr帮助

print repr(food)
if food < 0: #problem seems to be here

现在您看到food'-5' aha。

了解调试器

也是一个好主意
import pdb;pdb.set_trace()
if food < 0: #problem seems to be here

这将在控制台中为您提供(Pdb)提示。输入“food”并按Enter键

(Pdb) food
'-5'

同样,您可以很容易地注意到food是一个字符串。这是一个常见的错误,Python3中不再允许这些类型的比较