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语句的资料请关注脚本之家其它相关文章!

相关文章

  • python opencv实现旋转矩形框裁减功能

    python opencv实现旋转矩形框裁减功能

    这篇文章主要为大家详细介绍了python opencv实现旋转矩形框裁减功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 关于Python 实现tuple和list的转换问题

    关于Python 实现tuple和list的转换问题

    这篇文章主要介绍了Python 实现tuple和list的转换,文中介绍了list(列表)和tuple(元组)共同点和区别,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 使用python分析统计自己微信朋友的信息

    使用python分析统计自己微信朋友的信息

    这篇文章主要介绍了python分析统计自己微信朋友的信息,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 使用Python Tkinter创建一个动态祝福弹窗的详细教程

    使用Python Tkinter创建一个动态祝福弹窗的详细教程

    本文手把手教你用Python的Tkinter库创建一个浪漫的弹窗程序,包含淡入淡出动画、多线程管理、队列控制等高级特性,通过完整的代码解析和配置指南,带你掌握GUI编程的核心技巧,需要的朋友可以参考下
    2025-11-11
  • Python3使用requests模块实现显示下载进度的方法详解

    Python3使用requests模块实现显示下载进度的方法详解

    这篇文章主要介绍了Python3使用requests模块实现显示下载进度的方法,结合实例形式分析了Python3中requests模块的配置、使用及显示进度条类的相关定义方法,需要的朋友可以参考下
    2019-02-02
  • Python异常处理中else子句的作用与使用方法

    Python异常处理中else子句的作用与使用方法

    在Python编程中,异常处理是一项至关重要的功能,它允许程序在遇到错误时不会直接崩溃,而是能够优雅地处理异常情况,Python提供了try-except语句,用于捕获并处理代码执行过程中可能出现的异常,本文我们将深入探讨else子句的语法、使用场景以及实际代码示例
    2026-06-06
  • Python 图形绘制详细代码(二)

    Python 图形绘制详细代码(二)

    这篇文章主要介绍了Python 图形绘制详细代码,本文接着上文介绍介绍条形图的画法,同样附有详细的代码,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2021-12-12
  • 用Python实现web端用户登录和注册功能的教程

    用Python实现web端用户登录和注册功能的教程

    这篇文章主要介绍了用Python实现web端用户登录和注册功能的教程,需要的朋友可以参考下
    2015-04-04
  • 对python中数组的del,remove,pop区别详解

    对python中数组的del,remove,pop区别详解

    今天小编就为大家分享一篇对python中数组的del,remove,pop区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 在Python的列表中利用remove()方法删除元素的教程

    在Python的列表中利用remove()方法删除元素的教程

    这篇文章主要介绍了在Python的列表中利用remove()方法删除元素的教程,是Python入门中的基础知识,注意其和pop()方法的区别,需要的朋友可以参考下
    2015-05-05

最新评论