为什么字符串大于整数会被视为True?

3

为什么比较字符串和整数的结果为True?

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

我进行了更多的实验:

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

我认为在尝试比较时应该会出现错误,但似乎没有任何内容可以处理这种错误,或者应该使用assert,但如果使用-O标志运行Python代码可能会存在危险!


2
有一个类似的问题,有一个很好的答案:https://dev59.com/wXA75IYBdhLWcg3weZDu - Verena Haunschmid
这只是一个猜测,但我认为这种行为存在是为了让人们可以将字符串和整数放入有序容器中(这些容器需要对元素进行排序,因此这些元素必须是可比较的)。所以我猜想做出了一个选择,即无论它们的值如何,字符串都比整数“更高”。 - ereOn
1
“我认为应该有一个错误” - 开发人员同意!他们将行为更改为在Python 3中引发TypeError - user2357112
1个回答

9
来源:Python中字符串和整数的比较方法,引用自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

所以,这是因为在字母表中's'在'i'之后!不过,幸运的是,在Python 3.x的实现中已经“修复”了这种稍微奇怪的行为:

在Python 3.x中,尝试对整数和字符串进行排序将引发错误:

现在似乎更符合最小惊讶原则了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接