3

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

问题一:

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
4

3 回答 3

6

在 Python 2.x 中,不能直接比较的不同类型的项目使用它们的类型名称进行比较。所以所有整数都小于所有列表,因为"int"小于"list"。出于同样的原因,所有strs 都大于所有ints 和floats。

这种不直观的行为(我假设引入这种行为是为了使类似类型的项目在异构列表中一起排序)在 Python 3 中被删除,这引发了这些比较的异常。

于 2013-10-12T17:29:40.140 回答
1

从有关数据类型的文档中:

序列对象可以与具有相同序列类型的其他对象进行比较。比较使用字典顺序:首先比较前两项,如果它们不同,则确定比较的结果;如果它们相等,则比较接下来的两项,依此类推,直到任一序列用完。

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

而且,值得注意的是,

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

于 2013-10-12T17:35:15.110 回答
0

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

len(a) < len(b)
于 2013-10-12T17:43:05.203 回答