为什么在Python中元组比列表更大?

5

Consider following problem in Python:

>>> () < []

这个语句返回 False
>>> () > [] 

返回的结果为True。据我所知,[]等于False,但空元组是什么呢?

如果我们输入

>>> 1233 < (1,2)

我们得到了一个True的返回值,但为什么呢?
谢谢。

在Python2中,只有True - iMom0
@user995394,你说它只返回“True”,但是在我给出的链接中明显是“False”。 - BartoszKP
看看Python的源代码,也许答案就在那里。如果你认为你会在其他编程语言中遇到这种行为,那么这与一般的编程无关。 - StefanNch
可能是重复的问题:为什么元组比类似的列表更大? - Maxime Lorant
2
[] 不等于 False。它在逻辑上被评估为 False,与 () 相同。因此,bool(()) == bool([]) 返回 True - bogatron
显示剩余4条评论
5个回答

4

来自 docs:

运算符 <, >, ==, >=, <= 和 != 用于比较两个对象的值。这些对象不必具有相同的类型。如果两者都是数字,则它们会被转换为一种公共类型。否则,不同类型的对象始终不相等,并且按顺序一致但任意地排序。您可以通过定义 __cmp__ 方法或像 __gt__ 这样的丰富比较方法(在第3.4节中描述)来控制非内置类型的对象的比较行为。

(这种不寻常的比较定义是为了简化排序操作、in 和 not in 操作符的定义。在未来,不同类型的对象的比较规则可能会发生改变。

这是正确的。在 Python 3 中,这将产生一个 TypeError

() > []
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-d2326cfc55a3> in <module>()
----> 1 () > []

TypeError: unorderable types: tuple() > list()

回到Python 2:文档强调这是一种任意但一致的排序方式。

cPython 2中,不同类型的比较是通过它们的类型名称进行的。因此,tuple在词典顺序上“大于”list


2

这是 CPython (2.x) 的实现细节,如内置类型-比较文档所述:

CPython 实现细节:不同类型的对象(数字除外)按其类型名称排序;相同类型但不支持适当比较的对象按其地址排序。

因此,任何元组都比任何列表大,因为'tuple' > 'list'

在 CPython 3 中不再适用,对于 Python 2.x 的其他实现也从未适用。


1

提到文档

大多数其他内置类型的对象除非它们是同一对象,否则比较结果都不相等。在一个程序执行中,选择哪个对象被认为比另一个对象小或大是任意的但是一致的。

因此,这似乎取决于实现。例如,在CPython中:

除数字外的不同类型的对象按其类型名称排序;不支持适当比较的相同类型的对象按其地址排序。


0

这可能取决于实现,我认为没有直接的原因。 Python 3.X 禁止两种不同类型之间的比较。


0
这是因为Python 2.x使用了方法__cmp__()。而Python 3.x不再使用此方法。
您正在使用低于3.0版本的Python。
在Python 3.x版本中,会抛出一个异常:
TypeError: 不可比较的类型...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接