为啥 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"] == True
和5 > ["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? 不正确。<0
的计算结果为 False,但 dictionary
位于 int
之前
@yBot "不同类型的对象除了数字[...]"
这篇文章完全正确,除了数字5的例子。【参考方案2】:
它来自 python 2 的文档:
运算符
<
、>
、==
、>=
、<=
和!=
比较两个对象的值。对象不必具有相同的类型。如果两者都是数字,则将它们转换为通用类型。否则,不同类型的对象总是比较不相等,并且顺序一致但任意。您可以通过定义__cmp__
方法或__gt__
等丰富的比较方法来控制非内置类型对象的比较行为。
【讨论】:
【参考方案3】:根据this,不同类型只需要比较不相等,由实现决定如何处理。碰巧 CPython 的实现决定根据类型名称进行排序。
【讨论】:
否决票的任何具体原因? downvotes 可能是因为这个答案并没有真正回答任何问题,只是猜测......实际上,它不取决于实现。 想解释一下吗?它在官方文档中的什么地方定义了这个? 看到其他答案了吗? 我做到了。其他答案以及他们的示例都是关于 CPython 的,与官方语言文档无关以上是关于为啥 Python 2 允许列表和数字之间的比较? [复制]的主要内容,如果未能解决你的问题,请参考以下文章