我目前正在将一些Python2代码移植到Python3,并且遇到了这个小问题:
.contentrow
现在,在Python3中它会引发错误:
v = (1, )
if v < 1:
pass
这很好,因为您不能比较元组和整数。但是在Python2中,这是允许的:
TypeError: '<' not supported between instances of 'tuple' and 'int'.
我已经在Google上进行了搜索,但找不到有关此比较如何工作的示例。上面的示例如何/为什么评估为>>> (1, ) < 1
False
?
答案 0 :(得分:1)
全部在文档中
https://docs.python.org/2/library/stdtypes.html#comparisons
不同类型的对象(不同的数字类型和不同的字符串类型除外)永远不会比较相等;这样的对象可以一致但任意地排序(以便对异构数组进行排序可以得到一致的结果)。此外,某些类型(例如文件对象)仅支持退化的比较概念,其中该类型的任何两个对象都不相等。同样,此类对象可以任意但一致地排序。当任何操作数为复数时,<,<=,>和> =运算符将引发TypeError异常。
您已经注意到,由于比较机制的某些变化,比较元组和整数在Python 3中不再起作用:
https://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons
- 当操作数没有有意义的自然顺序时,顺序比较运算符(<,<=,> =,>)会引发TypeError异常。因此,像1 <'',0> None或len <= len这样的表达式不再有效,例如None
- builtin.sorted()和list.sort()不再接受提供比较功能的cmp参数。请改用key参数。 N.B.键和反向参数现在为“仅关键字”。
- 应将cmp()函数视为已消失,并且不再支持 cmp ()特殊方法。使用 lt ()进行排序,使用哈希()进行 eq ()以及其他所需的丰富比较。 (如果确实需要cmp()功能,则可以使用表达式(a> b)-(a