下面的代码在cpython中做什么?

wswtfjt7  于 7个月前  发布在  Python
关注(0)|答案(1)|浏览(71)

我在学习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)

ctzwtxfj

ctzwtxfj1#

IS_OP操作码用于 * isis not。当oparg1时,^oparg翻转比较结果(对于is not),当它是0时,则不去管它(对于is),所以相同的字节码可以处理两种情况,只需调整oparg(在dis输出中,isIS_OP 0is notIS_OP 1)。

相关问题