当我运行此代码时,食物就像-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()
这个概念是,如果你没有食物,你就不能去一个新的地方。我不介意替代这个。
答案 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
,那么这将是一种草率的编程方式。
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中不再允许这些类型的比较