为什么对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代码可能会很危险!
来源: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中,行为已更改,因此尝试排序整数和字符串将引发错误:
似乎现在更好地遵循最小惊讶的原则.
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |