if语句被跳过/忽略

The*_*dxo 0 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()
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 5

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

>>> '-5' < 0
False
Run Code Online (Sandbox Code Playgroud)

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

assert not isinstance(food, basestring)
if food < 0:
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

food = int(...)
Run Code Online (Sandbox Code Playgroud)

当然,你甚至可以int在这种情况下使用,

if int(food) < 0:
Run Code Online (Sandbox Code Playgroud)

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


CPython2文档,

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

所以,因为这个词'float'来之前'string'按字母顺序排列,所有的彩车是有序不到任何字符串.

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