Python 2如何比较字符串和int?为什么列表比数字大,元组比列表大?

Python 2如何比较字符串和int?为什么列表比数字大,元组比列表大?,python,types,comparison,python-2.x,Python,Types,Comparison,Python 2.x,以下代码段使用输出()进行注释: 打印“100”打印“9”#错误 打印“100”9#正确 打印[]>float('inf')#真 打印()>[]正确 有人能解释为什么输出是这样的吗 实施细节 这种行为是由语言规范规定的,还是由实现者决定的 主要的Python实现之间是否存在差异 Python语言的不同版本之间是否存在差异 字符串按词典进行比较,不同类型的字符串按其类型的名称进行比较(“int”“string”)。3.x通过使字符串不可比较来修正第二点。字符串按字典顺序进行比较,不同类型的字

以下代码段使用输出()进行注释:

打印“100”<“2”#正确
打印“5”>打印“9”#错误
打印“100”<2#假
打印100<“2”#正确
打印5>“9”#错误
打印“5”>9#正确
打印[]>float('inf')#真
打印()>[]正确
有人能解释为什么输出是这样的吗


实施细节
  • 这种行为是由语言规范规定的,还是由实现者决定的
  • 主要的Python实现之间是否存在差异
  • Python语言的不同版本之间是否存在差异
字符串按词典进行比较,不同类型的字符串按其类型的名称进行比较(
“int”
“string”
)。3.x通过使字符串不可比较来修正第二点。

字符串按字典顺序进行比较,不同类型的字符串按其类型的名称进行比较(
“int”
“string”)。3.x通过使它们不可比较来修正第二点。

来自:

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

当您对两个字符串或两个数字类型进行排序时,排序是按预期方式进行的(字符串的字典排序,整数的数字排序)

订购数字和非数字类型时,数字类型排在第一位

>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
>>5<'foo'
真的
>>> 5 < (1, 2)
真的
>>> 5 < {}
真的
>>> 5 < [1, 2]
真的
当您对两种不兼容的类型进行排序时,如果两种类型都不是数字类型,则会按照其类型名的字母顺序进行排序:

>>> [1, 2] > 'foo'   # 'list' < 'str' 
False
>>> (1, 2) > 'foo'   # 'tuple' > 'str'
True

>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
>[1,2]>'foo'#'list'<'str'
假的
>>>(1,2)>“foo”#“tuple”>“str”
真的
>>>类Foo(对象):pass
>>>类栏(对象):传递
>>>Bar()
一个例外是旧样式的类总是在新样式的类之前出现

>>> class Foo: pass           # old-style
>>> class Bar(object): pass   # new-style
>>> Bar() < Foo()
False
>class Foo:pass#老式
>>>类栏(对象):通过#新样式
>>>Bar()

这种行为是由语言规范规定的,还是由实现者决定的

有。报告说:

否则,不同类型的对象总是比较不相等,并且顺序一致但任意

因此,这是一个实现细节

主要的Python实现之间是否存在差异

我不能回答这个问题,因为我只使用了官方的CPython实现,但是还有其他Python实现,比如PyPy

Python语言的不同版本之间是否存在差异

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

>>> '10' > 5
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    '10' > 5
TypeError: unorderable types: str() > int()
'10'>5
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
'10' > 5
TypeError:无序类型:str()>int()
来自:

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

当您对两个字符串或两个数字类型进行排序时,排序是按预期方式进行的(字符串的字典排序,整数的数字排序)

订购数字和非数字类型时,数字类型排在第一位

>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
>>5<'foo'
真的
>>> 5 < (1, 2)
真的
>>> 5 < {}
真的
>>> 5 < [1, 2]
真的
当您对两种不兼容的类型进行排序时,如果两种类型都不是数字类型,则会按照其类型名的字母顺序进行排序:

>>> [1, 2] > 'foo'   # 'list' < 'str' 
False
>>> (1, 2) > 'foo'   # 'tuple' > 'str'
True

>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
>[1,2]>'foo'#'list'<'str'
假的
>>>(1,2)>“foo”#“tuple”>“str”
真的
>>>类Foo(对象):pass
>>>类栏(对象):传递
>>>Bar()
一个例外是旧样式的类总是在新样式的类之前出现

>>> class Foo: pass           # old-style
>>> class Bar(object): pass   # new-style
>>> Bar() < Foo()
False
>class Foo:pass#老式
>>>类栏(对象):通过#新样式
>>>Bar()

这种行为是由语言规范规定的,还是由实现者决定的

有。报告说:

否则,不同类型的对象总是比较不相等,并且顺序一致但任意

因此,这是一个实现细节

主要的Python实现之间是否存在差异

我不能回答这个问题,因为我只使用了官方的CPython实现,但是还有其他Python实现,比如PyPy

Python语言的不同版本之间是否存在差异

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

>>> '10' > 5
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    '10' > 5
TypeError: unorderable types: str() > int()
'10'>5
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
'10' > 5
TypeError:无序类型:str()>int()

很好,他们在Py3k中更改了它。当我第一次看到这个问题时,我的想法是‘什么,这不会引起错误?’。2.x规则的一个例外是,不同类型按类型的名称排序,即“无”对象的比较总是小于其他所有类型。在3.x中,将“无”与另一个类型进行比较仍然会引发类型错误。@KarelBilek:bool是一个数字类型。True==1,所以它既不是<也不是>。它们的类型名称的字母顺序?你什么时候会希望这成为一个功能?谁会用它呢?有趣的事实:
complex(1,0)>'abc'
False
,但是
complex(1,0)>complex(0,0)
引发了
TypeError
很好,他们在Py3k中更改了它。当我第一次看到这个问题时,我的想法是‘什么,这不会引起错误?’。2.x规则的一个例外是,不同的类型按类型的名称排序,即None obj