我在学习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;
...
}
字符串
我知道前两个语句pop
是堆栈中的操作数。
PyObject *right = POP();
PyObject *left = TOP();
型
但我的问题与以下声明有关:
int res = (left == right)^oparg;
型
在我的理解is
运算符在python中比较对象身份,换句话说,它将检查两个对象是否指向同一个对象.所以我的问题是,只有下面的代码是足够的检查object identity?,为什么实际实现再次应用exlcusive OR(^
)与oparg
?
int res = (left == right)
型
1条答案
按热度按时间ctzwtxfj1#
IS_OP
操作码用于 *is
和is not
。当oparg
为1
时,^oparg
翻转比较结果(对于is not
),当它是0
时,则不去管它(对于is
),所以相同的字节码可以处理两种情况,只需调整oparg
(在dis
输出中,is
是IS_OP 0
,is not
是IS_OP 1
)。