【问题标题】: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,如果你尝试这样的比较会引发异常。

标签: python python-2.7


【解决方案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 的,与官方语言文档无关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2021-07-23
    • 1970-01-01
    • 2016-03-09
    • 2021-10-14
    相关资源
    最近更新 更多