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

6 投票
4 回答
779 浏览
提问于 2025-04-16 07:32

在Python 3中,int(50)<'2'会引发一个TypeError错误,这样做是合理的。然而,在Python 2.x中,int(50)<'2'却会返回True(其他数字格式也是如此,但int在Python 2和3中都有)。那么,我的问题有几个部分:

  1. 为什么Python 2.x(小于3的版本)会允许这种行为?
    • (是谁觉得这样做是个好主意的???)
  2. 一个int小于一个str是什么意思?
    • 这是不是在说ord / chr
    • 有没有什么不太明显的二进制格式?
  3. 在这方面,'5'u'5'有什么区别吗?

4 个回答

1

(谁会觉得允许这样做是个好主意呢???)

我想原因可能是为了让不同类型的对象能够存储在像树一样的结构中,而这些结构在内部会进行比较。

6

之所以允许这些比较,是因为排序的原因。在Python 2.x中,可以对包含不同类型的列表进行排序,比如字符串和整数——整数总是排在前面。而在Python 3.x中,就不允许这样做,正是因为你提到的那些原因。

Python 2.x:

>>> sorted([1, '1'])
[1, '1']
>>> sorted([1, '1', 2, '2'])
[1, 2, '1', '2']

Python 3.x:

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

它的工作原理是这样的1

>>> float() == long() == int() < dict() < list() < str() < tuple()
True

数字比较时会被视为小于容器。数字类型会被转换成一种共同的类型,然后根据它们的数值进行比较。而容器则是根据它们名字的字母顺序来比较的。2

来自文档

CPython的实现细节:不同类型的对象(除了数字)会根据它们的类型名称进行排序;同一类型但不支持正常比较的对象则根据它们的地址进行排序。

不同内置类型的对象会根据它们类型的名字按字母顺序比较,比如int以'i'开头,而str以's'开头,所以任何int都小于任何str

  1. 我完全不明白。
    • 一个醉酒的高手。
  2. 这意味着内置类型之间引入了一种正式的顺序。
    • 这是指一种任意的顺序。
    • 不。
  3. 不。字符串和unicode对象在这个情况下被视为相同。你可以试试看。

关于long < int的评论的回应

>>> int < long
True

你可能是指这些类型的值,在这种情况下,数字比较是适用的。

1 这些都是在Python 2.6.5上说的

2 感谢kRON帮我澄清这一点。我之前从没想过要把数字和dict比较,而数字的比较是那种显而易见到容易被忽视的事情。

撰写回答