Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2如何比较字符串和int?为什么列表比数字大,元组比列表大?_Python_Types_Comparison_Python 2.x - Fatal编程技术网

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通过使它们不可比较来修正第二点。来自: CPython实现细节:除数字外

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

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


实施细节
  • 这种行为是由语言规范规定的,还是由实现者决定的
  • 主要的Python实现之间是否存在差异
  • Python语言的不同版本之间是否存在差异
字符串按词典进行比较,不同类型的字符串按其类型的名称进行比较(
“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()

很好,他们在Py3k中更改了它。当我第一次看到这个问题时,我的想法是‘什么,这不会引起错误?’。2.x规则的一个例外是,不同类型按类型的名称排序,即“无”对象的比较总是小于其他所有类型。在3.x中,将“无”与另一个类型进行比较仍然会引发类型错误。@KarelBilek:bool是一个数字类型。True==1,所以它既不是<也不是>。它们的类型名称的字母顺序?你什么时候会希望这成为一个功能?谁会用它呢?有趣的事实:
complex(1,0)>'abc'
False
但是
complex(1,0)>complex(0,0)
在这个问题的3000个重复中提出了一个
TypeError
,答案解释了为什么语言是这样设计的(以及为什么它是在3.x中重新设计的)。这不是这个问题的一部分,而是这里链接的许多问题的一部分。但在python2中,int小于dicts,所以它不能只是按类型名称按字母顺序排列?我刚刚找到了这个答案,并同意Tony Suffolk的观点。对象不相似时不按类型名排序。@TonySuffolk66数字类型是该规则的例外。NumericType始终低于2.7中的任何其他类型(非类型除外)。
>>> '10' > 5
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    '10' > 5
TypeError: unorderable types: str() > int()