首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么python2.x中的int(50)<str(5)?

为什么python2.x中的int(50)<str(5)?
EN

Stack Overflow用户
提问于 2010-11-24 12:44:47
回答 3查看 724关注 0票数 6

在python 3中,int(50)<'2'会导致一个TypeError,而且它应该这样做。但是,在python2.x中,int(50)<'2'返回True (其他数字格式也是如此,但int同时存在于py2和py3中)。我的问题有几个部分:

  1. 为什么Python2.x (< 3?)允许这种行为?
    • (谁认为允许这样做是个好主意?)

  2. int小于str是什么意思?
    • 它是指ord / chr吗?
    • 是否有一些不太明显的二进制格式?

  1. '5'u'5'在这方面有什么区别吗?
EN

回答 3

Stack Overflow用户

发布于 2010-11-24 13:06:33

允许进行这些比较的原因是排序。Python2.x可以对包含混合类型的列表进行排序,包括字符串和整数--整数总是首先出现的。Python3.x不允许这样做,这正是您指出的原因。

Python2.x:

代码语言:javascript
运行
复制
>>> sorted([1, '1'])
[1, '1']
>>> sorted([1, '1', 2, '2'])
[1, 2, '1', '2']

Python3.x:

代码语言:javascript
运行
复制
>>> sorted([1, '1'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()
票数 6
EN

Stack Overflow用户

发布于 2010-11-24 12:56:00

(谁认为允许这样做是个好主意?)

我可以想象,原因可能是允许将来自不同类型的对象存储在类似树的结构中,这些结构在内部使用比较。

票数 1
EN

Stack Overflow用户

发布于 2010-11-24 13:11:38

就像亚伦说的。把它分解成你的观点:

  1. 因为它使排序能够在中途可用,否则根本就没有意义(混合列表)。一般来说,这不是一个好主意,但Python中的很多内容都是为了方便而不是严格。
  2. 按类型名称排序。这意味着同一类型组的事物在一起,它们可以在其中进行排序。它们可能应该按类型类分组,例如数字在一起,但是没有合适的类型类框架。其中可能有一些更具体的规则(可能是数字类型的规则),我必须检查源代码。
  3. 一个是字符串,另一个是unicode。然而,他们可能有一个直接的比较操作,但是可以想象,一个不可比较的类型会在他们之间被分组,造成混乱。我不知道是否有避免这种情况的密码。

所以,这在一般情况下是没有意义的,但偶尔也会有所帮助。

代码语言:javascript
运行
复制
from random import shuffle
letters=list('abcdefgh')
ints=range(8)
both=ints+letters
shuffle(ints)
shuffle(letters)
shuffle(both)
print sorted(ints+letters)
print sorted(both)

两者都先打印ints,然后打印字母。

通常,您不希望在程序中随机混合类型,而且显然Python 3阻止了Python 2在不存在的情况下试图使其具有模糊的意义。如果您真的愿意,仍然可以按lambda a,b: cmp(repr(a),repr(b)) (或其他更好的)进行排序,但语言开发人员似乎认为这是不切实际的默认行为。我希望它是不同的,这给我们带来了最小的惊喜,但是在Python 2的意义上,发现问题要困难得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4266918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档