0

当我运行这段代码时,食物类似于-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()

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

4

2 回答 2

5

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

>>> '-5' < 0
False

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

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

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

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

food = int(...)

当然,你甚至可以int在条件下使用,

if int(food) < 0:

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


CPython2 文档

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

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

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

于 2013-10-28T00:06:41.110 回答
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'

了解调试器也是一个好主意

import pdb;pdb.set_trace()
if food < 0: #problem seems to be here

这将(Pdb)在控制台中为您提供提示。输入“食物”并按回车

(Pdb) food
'-5'

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

于 2013-10-28T00:18:26.293 回答