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)
这个概念是,如果你没有食物,你就不能去一个新的地方.我不介意替代这个.
确保它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,那么这将是一个草率的编程方式.
CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序; 不支持正确比较的相同类型的对象按其地址排序.
所以,因为这个词'float'来之前'string'按字母顺序排列,所有的彩车是有序不到任何字符串.
在Python3中,比较不同类型的对象会引发TypeError,从而消除了这个陷阱.