小编典典

`is`运算符是否在Python中使用__magic__方法?

python

运营商身份使用测试。

我想知道,如果is运营商和id()函数调用任何__magic__方法,方式==调用__eq__

我有一些有趣的结帐__hash__

class Foo(object):
    def __hash__(self):
        return random.randint(0, 2 ** 32)

a = Foo()
b = {}
for i in range(5000):
    b[a] = i

考虑一下dictb和…的价值b[a]

的每个后续查找d[a]都是aKeyError或随机整数。

但随着对特殊方法的文档状态

[ x 的默认实现__hash__()返回id(x)。

因此,有 只是周围的其他方式两者之间的关系,但。

我在这里和这里已经看到了许多问题)已经帮助了许多困惑的人,但是我找不到这个问题的答案。is``id


阅读 216

收藏
2020-12-20

共1个答案

小编典典

不,is是直接指针比较,id只是将转换为的对象地址返回long

来自ceval.c

case PyCmp_IS:
    res = (v == w);
    break;
case PyCmp_IS_NOT:
    res = (v != w);
    break;

vw这里简单PyObject *

来自bltinmodule.c

static PyObject *
builtin_id(PyObject *self, PyObject *v)
{
    return PyLong_FromVoidPtr(v);
}

PyDoc_STRVAR(id_doc,
"id(object) -> integer\n\
\n\
Return the identity of an object. This is guaranteed to be unique among\n\
simultaneously existing objects. (Hint: it's the object's memory address.)");
2020-12-20