【发布时间】:2021-03-20 21:25:40
【问题描述】:
我正在学习 cpython 内部结构(尤其是 is 运算符)并在ceval.c 中遇到了以下IS_OP 的操作码实现
case TARGET(IS_OP): {
PyObject *right = POP();
PyObject *left = TOP();
int res = (left == right)^oparg;
PyObject *b = res ? Py_True : Py_False;
...
}
我知道前两个语句从堆栈中弹出操作数。
PyObject *right = POP();
PyObject *left = TOP();
但我的问题与以下陈述有关。
int res = (left == right)^oparg;
据我了解,python 中的is 运算符比较对象身份,在其他团队中,它将检查两个对象是否指向同一个对象。所以我的问题是,只有下面的代码就足以检查object identity?,为什么实际的实现再次应用一个exlcusive OR(^) 和oparg?
int res = (left == right)
【问题讨论】:
标签: python python-3.x cpython python-internals