为什么在python 2.x中int(50)<str(5)?

cwa*_*ole 6 python string int comparison python-2.x

在python 3中,int(50)<'2'导致a TypeError,以及它应该.但是,在python 2.x中,int(50)<'2'返回True(对于其他数字格式也是如此,但int在py2和py3中都存在).那么,我的问题有几个部分:

  1. 为什么Python 2.x(<3?)允许这种行为?
    • (谁认为允许这个开头是个好主意?)
  2. 一个int小于一个是什么意思str
    • 是指ord/ chr
    • 是否有一些二进制格式不太明显?
  3. 这方面'5'u'5'这方面有区别吗?

aar*_*ing 8

它的工作原理如下1.

>>> float() == long() == int() < dict() < list() < str() < tuple()
True
Run Code Online (Sandbox Code Playgroud)

数字比较小于容器.数字类型将转换为通用类型,并根据其数值进行比较.容器按其名称的字母值进行比较.2

来自文档:

CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序; 不支持正确比较的相同类型的对象按其地址排序.

不同内置类型的对象按字母顺序按类型名称进行比较int,以"i" str开头,以一个s以任何int小于任何值开头str..

  1. 我不知道.
    • 一个醉酒的主人.
  2. 这意味着已在内置类型上引入了正式的订单.
    • 它指的是任意顺序.
    • 没有.
  3. 为此目的,编号字符串和unicode对象被认为是相同的.试试看.

回应关于的评论 long < int

>>> int < long
True
Run Code Online (Sandbox Code Playgroud)

您可能意味着这些类型的值,在这种情况下,数字比较适用.

1这完全在Python 2.6.5上

2感谢kRON为我解决这个问题.我从来没有想过将数字与dict之前的数字进行比较,数字的比较就是那些很容易被忽视的事情之一.

  • ......是的,我的意思是,那是完全合乎逻辑的,不是吗? (2认同)

int*_*tgr 6

允许这些比较的原因是排序.Python 2.x可以对包含混合类型的列表进行排序,包括字符串和整数 - 整数首先出现.由于您指出的确切原因,Python 3.x不允许这样做.

Python 2.x:

>>> sorted([1, '1'])
[1, '1']
>>> sorted([1, '1', 2, '2'])
[1, 2, '1', '2']
Run Code Online (Sandbox Code Playgroud)

Python 3.x:

>>> sorted([1, '1'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这是排序因为它允许比较,而不是相反. (2认同)