Python中的奇怪比较

时间:2013-10-12 17:24:24

标签: python comparison-operators

我在胡闹,偶然发现了一些我不明白的事情......

问题1:

a = [1,2,3]
b = [1,2,3,4]

len(a) < b

结果是True,但这实际上是在比较两个列表的长度吗?似乎是因为这也是真的......

a = [15,32,7]
len(a) < b

问题2:

当我们尝试将整数与列表进行比较时会发生什么?为什么这些都是真的(我假设有一般性解释......)......

3 < b
20 < b
float('inf') < b
None < b
(lambda x: (x**x)**x) < b

......这些都是假的?

'poo' < b
'0' < b

3 个答案:

答案 0 :(得分:6)

在Python 2.x中,使用类型名称比较不可直接比较的不同类型的项目。因此,所有整数都小于所有列表,因为"int"小于"list"。出于同样的原因,所有str s都大于所有intfloat s。

这种不直观的行为(我假设是为了在异类列表中将类似类型的项排序在一起)在Python 3中被删除,这为这些比较提出了一个例外。

答案 1 :(得分:1)

来自docs数据类型:

  

可以将序列对象与具有相同对象的其他对象进行比较   序列类型。比较使用词典排序:首先是   比较前两项,如果它们不同则决定了   比较结果;如果他们是平等的,接下来的两个项目是   比较,等等,直到两个序列都用完为止。

  

请注意,比较不同类型的对象是合法的。结果   是确定性的但是随意的:类型按名称排序。   因此,列表总是小于字符串,字符串总是如此   小于元组等。1比较混合数字类型   根据它们的数值,0等于0.0,等等。

而且,值得注意的是,

  

脚注 1比较不同类型对象的规则   不应该依赖;它们可能会在未来的版本中发生变化   语言。

答案 2 :(得分:0)

其他答案很好地解释了正在发生的事情,但比较长度的正确方法是

len(a) < len(b)