为什么字符串> int评估为True?

时间:2014-01-28 07:41:12

标签: python python-2.7

如何检查字符串> int评估为True?

>>> strver = "1"
>>> ver = 1
>>> strver > ver
True
>>> strVer2 = "whaat"
>>> strVer2 > ver
True

进行了一些实验:

>>> ver3 = 0
>>> strVer2 > ver3
True

我认为在尝试比较时应该会出现错误,但似乎没有构建任何错误来处理这样的错误,或者应该使用assert但是如果使用-O运行python代码可能会很危险标志!

1 个答案:

答案 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中,行为已被更改,因此尝试对整数和字符串进行排序会引发错误:

现在似乎更好地遵循了最不惊讶的原则。