为什么string> int求值为True?

Cia*_*arz 3 python python-2.7

为什么对string> int的检查求值为True?

>>> strver = "1"
>>> ver = 1
>>> strver > ver
True
>>> strVer2 = "whaat"
>>> strVer2 > ver
True
Run Code Online (Sandbox Code Playgroud)

做了一些实验:

>>> ver3 = 0
>>> strVer2 > ver3
True
Run Code Online (Sandbox Code Playgroud)

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

sun*_*nce 9

来源:Python如何比较字符串和int?,反过来引用CPython 手册:

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
Run Code Online (Sandbox Code Playgroud)

......所以,这是因为's'来自字母表中的'i'!幸运的是,这个稍微奇怪的行为已经在Python 3.x的实现中"修复"了:

在Python 3.x中,行为已更改,因此尝试排序整数和字符串将引发错误:

似乎现在更好地遵循最小惊讶的原则.