如何检查字符串> int评估为True?
>>> strver = "1"
>>> ver = 1
>>> strver > ver
True
>>> strVer2 = "whaat"
>>> strVer2 > ver
True
进行了一些实验:
>>> ver3 = 0
>>> strVer2 > ver3
True
我认为在尝试比较时应该会出现错误,但似乎没有构建任何错误来处理这样的错误,或者应该使用assert
但是如果使用-O运行python代码可能会很危险标志!
答案 0 :(得分:9)
来源:How does Python compare string and int?,反过来引用CPython manual:
CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
从SO回答:
当您订购两个不兼容的类型(两者都不是数字)时,它们按其类型名的字母顺序排序:
>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
......所以,这是因为's'来自字母表中的'i'!幸运的是,这个稍微奇怪的行为已经在Python 3.x的实现中“修复”了:
在Python 3.x中,行为已被更改,因此尝试对整数和字符串进行排序会引发错误:
现在似乎更好地遵循了最不惊讶的原则。