代码之家  ›  专栏  ›  技术社区  ›  cwallenpoole

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

  •  6
  • cwallenpoole  · 技术社区  · 14 年前

    在python 3中, int(50)<'2' 导致 TypeError 嗯,应该是。然而,在python 2.x中, 内景(50)<'2' 退货 True (其他数字格式也是如此,但是 int 同时存在于py2和py3中)。那么,我的问题有几个部分:

    1. 为什么python 2.x(<3?)允许此行为?
    • (谁认为这是一个好主意让这一切开始呢???)
  • 这意味着什么? int 小于A str ?
    • 是指 ord / chr ?
    • 是否有一些不太明显的二进制格式?
  • 两者之间有区别吗 '5' u'5' 在这方面?
  • 4 回复  |  直到 14 年前
        1
  •  8
  •   aaronasterling    14 年前

    它是这样工作的 .

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

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

    来自 docs :

    cpython实现详细信息:不同类型(数字除外)的对象按>其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。

    不同内置类型的对象按其类型的名称按字母顺序进行比较 int 以“i”开头,然后 str 从一开始 s 所以任何 int 小于任何 STR . .

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

    回应有关 long < int

    >>> int < long
    True
    

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

    1这一切都在python 2.6.5上。

    2感谢克伦为我清理这些。我从来没想过把一个数字和一个 dict 之前和比较数字是一件很明显很容易被忽视的事情。

        2
  •  6
  •   intgr    14 年前

    允许这些比较的原因是排序。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()
    
        3
  •  1
  •   dmeister    14 年前

    (谁认为这是一个好主意让这一切开始呢???)

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

        4
  •  1
  •   Yann Vernier    14 年前

    正如亚伦所说。把它分解成你的观点:

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

    所以,在一般情况下这是没有意义的,但有时它是有帮助的。

    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)
    

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

    通常情况下,您不希望在程序中随机混合类型,很明显,python 3在python 2试图在不存在任何类型的情况下模糊地理解类型时会阻止它。你仍然可以根据 lambda a,b: cmp(repr(a),repr(b)) (或者更好的方法)如果你真的想这样做,但是语言开发人员似乎同意这是不切实际的默认行为。我预计它会有所变化,这是最不令人惊讶的,但从Python2的意义上来说,要检测到一个问题要困难得多。