Python 2.7如何比较列表中的项目

比克利尔

我今天遇到了这个有趣的例子

class TestableEq(object):
    def __init__(self):
        self.eq_run = False
    def __eq__(self, other):
        self.eq_run = True
        if isinstance(other, TestableEq):
            other.eq_run = True
        return self is other

>>> eq = TestableEq()
>>> eq.eq_run
False
>>> eq == eq
True
>>> eq.eq_run
True
>>> eq = TestableEq()
>>> eq is eq
True
>>> eq.eq_run
False
>>> [eq] == [eq]
True
>>> eq.eq_run    # Should be True, right?
False
>>> (eq,) == (eq,)    # Maybe with tuples?
True
>>> eq.eq_run
False
>>> {'eq': eq} == {'eq': eq}    # dicts?
True
>>> eq.eq_run
False
>>> import numpy as np    # Surely NumPy works as expected
>>> np.array([eq]) == np.array([eq])
True
>>> eq.eq_run
False

因此,似乎容器内部的比较在Python中的工作方式有所不同。我希望对的调用==将使用的每个对象的实现__eq__,否则有什么意义呢?此外

class TestableEq2(object):
    def __init__(self):
        self.eq_run = False
    def __eq__(self, other):
        self.eq_run = True
        other.eq_run = True
        return False

>>> eq = TestableEq2()
>>> [eq] == [eq]
True
>>> eq.eq_run
False
>>> eq == eq
False
>>> eq.eq_run
True

这是否意味着Python会改用is容器内部的实现__eq__有没有解决的办法?

我的用例是,我正在构建一个继承自某些collectionsABC的数据结构,并且我想编写测试以确保我的结构行为正确。我认为注入一个比较时记录的值很简单,但是令我惊讶的是,在检查以确保比较发生时测试失败。

编辑:我应该提到这是在Python 2.7上,但是我在3.3上看到了相同的行为。

Reut Sharabani

==如果项目相同(is),CPython的基础实现将跳过列表中项目的相等性检查)。

CPython将此作为假设身份隐含相等的优化。

这记录在PyObject_RichCompareBool中,用于比较项目:

注意:如果o1和o2是同一对象,则PyObject_RichCompareBool()对于Py_EQ将始终返回1,对于Py_NE将始终返回0。

listobject.c实现:

/* Search for the first index where items are different */
for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
    int k = PyObject_RichCompareBool(vl->ob_item[i],
                                     wl->ob_item[i], Py_EQ);
    // k is 1 if objects are the same
    // because of RichCmopareBool's behaviour
    if (k < 0)
        return NULL;
    if (!k)
        break;
}

正如你可以看到,只要RichCompareBool1True)的项目不检查。

object.c的实现PyObject_RichCompareBool

/* Quick result when objects are the same.
   Guarantees that identity implies equality. */
if (v == w) {
    if (op == Py_EQ)
        return 1;
    else if (op == Py_NE)
        return 0;
}
// ... actually deep-compare objects

要覆盖此内容,您必须手动比较各项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Python中相互比较2个列表?

来自分类Dev

如何比较两个列表中的项目Python 3.3

来自分类Dev

如何从 Python 中的列表中比较和提取某些项目?

来自分类Dev

如何在Python的各自列表中比较同一索引中2个列表中的元素?

来自分类Dev

如何使用Python 2中的旧列表创建包含特定项目的新列表?

来自分类Dev

如何从python中的2D列表中打印1到许多项目

来自分类Dev

比较python 2中的两个dicts列表

来自分类Dev

在 Python 中连接列表中的 2 个项目

来自分类Dev

如何比较2个不同列表视图中的项目

来自分类Dev

比较 2 个列表中相同索引上的项目

来自分类Dev

如何优化python列表中的比较组合

来自分类Dev

如何比较子列表python中的元素?

来自分类Dev

Python:如何比较列表中的值?

来自分类Dev

如何在 Python 中比较列表中的对?

来自分类Dev

将我与Python列表中的其他项目进行比较

来自分类Dev

如何仅使用键比较python中的2个JSON

来自分类Dev

Python:如何将一个列表中的所有项目作为字符串与另一列表中的所有项目进行比较?

来自分类Dev

Python:如何将 2D 列表中项目的索引分配给两个整数变量?

来自分类Dev

如何使列表中的项目永久运行-python

来自分类Dev

如何使列表中的项目永久运行-python

来自分类Dev

python:如何评估列表中的项目

来自分类Dev

如何从python列表中删除项目

来自分类Dev

如何消除python列表中的项目

来自分类Dev

使用Python 2比较2个列表的所有元素

来自分类Dev

将当前项目与python列表中的下一个项目进行比较

来自分类Dev

将当前项目与python列表中的下一个项目进行比较

来自分类Dev

Python 通过 Issubset 或其他方法比较列表列表中的项目

来自分类Dev

Python-将列表中的每个项目与该列表中的其他所有项目进行比较

来自分类Dev

如何在Python中合并2个词典列表

Related 相关文章

  1. 1

    如何在Python中相互比较2个列表?

  2. 2

    如何比较两个列表中的项目Python 3.3

  3. 3

    如何从 Python 中的列表中比较和提取某些项目?

  4. 4

    如何在Python的各自列表中比较同一索引中2个列表中的元素?

  5. 5

    如何使用Python 2中的旧列表创建包含特定项目的新列表?

  6. 6

    如何从python中的2D列表中打印1到许多项目

  7. 7

    比较python 2中的两个dicts列表

  8. 8

    在 Python 中连接列表中的 2 个项目

  9. 9

    如何比较2个不同列表视图中的项目

  10. 10

    比较 2 个列表中相同索引上的项目

  11. 11

    如何优化python列表中的比较组合

  12. 12

    如何比较子列表python中的元素?

  13. 13

    Python:如何比较列表中的值?

  14. 14

    如何在 Python 中比较列表中的对?

  15. 15

    将我与Python列表中的其他项目进行比较

  16. 16

    如何仅使用键比较python中的2个JSON

  17. 17

    Python:如何将一个列表中的所有项目作为字符串与另一列表中的所有项目进行比较?

  18. 18

    Python:如何将 2D 列表中项目的索引分配给两个整数变量?

  19. 19

    如何使列表中的项目永久运行-python

  20. 20

    如何使列表中的项目永久运行-python

  21. 21

    python:如何评估列表中的项目

  22. 22

    如何从python列表中删除项目

  23. 23

    如何消除python列表中的项目

  24. 24

    使用Python 2比较2个列表的所有元素

  25. 25

    将当前项目与python列表中的下一个项目进行比较

  26. 26

    将当前项目与python列表中的下一个项目进行比较

  27. 27

    Python 通过 Issubset 或其他方法比较列表列表中的项目

  28. 28

    Python-将列表中的每个项目与该列表中的其他所有项目进行比较

  29. 29

    如何在Python中合并2个词典列表

热门标签

归档