CPython中处理is与is not语句示例详解

 更新时间:2023年07月25日 16:11:12   作者:weapon  
这篇文章主要为大家介绍了CPython中处理is与is not语句示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

起步

文档中 https://docs.python.org/3.8/r... 表示对于 x is y 当且仅当两个变量指向同一对象时才为真。对象可以通过 id() 函数来查看它的身份(id() 函数返回了对象在内存中的映射)。

is 与 is not 的字节码

is 与 is not 都是操作符。 is not 是整体的,千万别把 x is not y 当做是 x is (not y) 。

来看看这两个操作符对应的字节码(基于 Python 3.8):

>>> def fun():
...   x is y
...   x is not y
... 
>>> import dis
>>> dis.dis(fun)
  2           0 LOAD_GLOBAL              0 (x)
              2 LOAD_GLOBAL              1 (y)
              4 COMPARE_OP               8 (is)
              6 POP_TOP
  3           8 LOAD_GLOBAL              0 (x)
             10 LOAD_GLOBAL              1 (y)
             12 COMPARE_OP               9 (is not)
             14 POP_TOP
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE
>>>

对于 COMPARE_OP 对应的动作

case TARGET(COMPARE_OP): {
    PyObject *right = POP();
    PyObject *left = TOP();
    PyObject *res = cmp_outcome(tstate, oparg, left, right);
    Py_DECREF(left);
    Py_DECREF(right);
    SET_TOP(res);
    if (res == NULL)
        goto error;
    PREDICT(POP_JUMP_IF_FALSE);
    PREDICT(POP_JUMP_IF_TRUE);
    DISPATCH();
}

这部分的代码的含义是先将代对比的两个操作数从栈中取出,通过 cmp_outcome(tstate, oparg, left, right) 得到两数的操作结果,再将结果 res 放入栈顶。

cmp_outcome 函数的相关代码是:

static PyObject *
cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w)
{
    int res = 0;
    switch (op) {
    case PyCmp_IS:
        res = (v == w);
        break;
    case PyCmp_IS_NOT:
        res = (v != w);
        break;
        ...
    }
    v = res ? Py_True : Py_False;
    Py_INCREF(v);
    return v;
}

在 cmp_outcome() 函数中,仅通过对比两个指针的值是否相等来判断它们是否是指向同一对象。

纯Python代码解释

通过 id() 函数可以来判断某一对象在内存中对应的地址,因此用它也可以来判断两个变量是否指向了同一对象:

def _is(a, b):
    return id(a) == id(b)

def _is_not(a, b):
    return id(a) != id(b)

以上就是CPython中处理is与is not语句示例详解的详细内容,更多关于CPython处理is is not语句的资料请关注脚本之家其它相关文章!

相关文章

  • pycharm中import导入包呈现灰色的问题及解决

    pycharm中import导入包呈现灰色的问题及解决

    这篇文章主要介绍了pycharm中import导入包呈现灰色的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 浅析Python中的多重继承

    浅析Python中的多重继承

    这篇文章主要介绍了Python中的多重继承,是Python学习中的基本知识,代码基于Python2.x版本,需要的朋友可以参考下
    2015-04-04
  • Python数据结构与算法之列表(链表,linked list)简单实现

    Python数据结构与算法之列表(链表,linked list)简单实现

    这篇文章主要介绍了Python数据结构与算法之列表(链表,linked list)简单实现,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • django开发post接口简单案例,获取参数值的方法

    django开发post接口简单案例,获取参数值的方法

    今天小编就为大家分享一篇django开发post接口简单案例,获取参数值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 用vue.js组件模拟v-model指令实例方法

    用vue.js组件模拟v-model指令实例方法

    在本篇文章里小编给各位整理的是关于用vue.js组件模拟v-model指令实例方法和相关代码,需要的朋友们可以跟着学习下。
    2019-07-07
  • Python中Tkinter组件Listbox的具体使用

    Python中Tkinter组件Listbox的具体使用

    本文主要介绍了Python中Tkinter组件Listbox的具体使用,Listbox组件用于显示一个选择列表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • python 中collections的 deque使用详解

    python 中collections的 deque使用详解

    这篇文章主要介绍了python中collections的deque使用详解,deque是一个双端队列,如果要经常从两端append的数据,选择这个数据结构就比较好了,更多相关内容,需要的小伙伴可以参考下面文章内容
    2022-09-09
  • Python执行遗传编程gplearn库使用实例探究

    Python执行遗传编程gplearn库使用实例探究

    这篇文章主要为大家介绍了Python执行遗传编程gplearn库使用实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • python基础操作列表切片解析

    python基础操作列表切片解析

    列表和字符串一样,列表同样可以截取和被索引,列表被截取后返回一个包含所需元素的新列表,List中的元素是可以改变的,需要的朋友可以参考下
    2023-04-04
  • Django User 模块之 AbstractUser 扩展详解

    Django User 模块之 AbstractUser 扩展详解

    这篇文章主要介绍了Django User 模块之 AbstractUser 扩展详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论