为啥 Python 2 允许列表和数字之间的比较? [复制]

Posted

技术标签:

【中文标题】为啥 Python 2 允许列表和数字之间的比较? [复制]【英文标题】:Why does Python 2 allow comparisons between lists and numbers? [duplicate]为什么 Python 2 允许列表和数字之间的比较? [复制] 【发布时间】:2017-04-18 04:05:40 【问题描述】:

我最近在我的程序中发现了一个错字

while len(first_list) > second_list:
    do_stuff

我玩弄了这个,发现5 < ["apple"] == True5 > ["apple"] == False

为什么 Python 允许进行此类比较?在后台评估什么以确定5 小于["apple"]

【问题讨论】:

因为 Python 2 在设计上被破坏了,你应该使用 Python 3,如果你尝试这样的比较会引发异常。 【参考方案1】:

我认为在这种情况下比较类型,所以它就像写:

type(5) < type(["apple"])

因为“int”和“list”是按字典顺序比较的(“i”

如果你尝试:

"5" > ["apple"]

你会得到 False,因为 "string" > "list"。

Documentation:

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

【讨论】:

任何证明这一点的文档或源代码链接都会有所帮助。没有它,这只是一个假设 在 SO 上查看其他问题:How does Python compare string and int? 不正确。 &lt;0 的计算结果为 False,但 dictionary 位于 int 之前 @yBot "不同类型的对象除了数字[...]" 这篇文章完全正确,除了数字5的例子。【参考方案2】:

它来自 python 2 的文档:

运算符&lt;&gt;==&gt;=&lt;=!= 比较两个对象的值。对象不必具有相同的类型。如果两者都是数字,则将它们转换为通用类型。否则,不同类型的对象总是比较不相等,并且顺序一致但任意。您可以通过定义__cmp__ 方法或__gt__ 等丰富的比较方法来控制非内置类型对象的比较行为。

【讨论】:

【参考方案3】:

根据this,不同类型只需要比较不相等,由实现决定如何处理。碰巧 CPython 的实现决定根据类型名称进行排序。

【讨论】:

否决票的任何具体原因? downvotes 可能是因为这个答案并没有真正回答任何问题,只是猜测......实际上,它取决于实现。 想解释一下吗?它在官方文档中的什么地方定义了这个? 看到其他答案了吗? 我做到了。其他答案以及他们的示例都是关于 CPython 的,与官方语言文档无关

以上是关于为啥 Python 2 允许列表和数字之间的比较? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python 中[0-9]为啥代表一位数字

Python - 创建具有 2 个值之间的数字的列表?

js字符串和数字之间的大小对比!

比较python列表中的数字序列

查找列表中连续数字之间的差异(Python)

python多了一个斜杠,为啥不行