作家
登录

Python源码理解: +=和 xx = xx + xx的区别

作者: 来源: 2017-06-19 09:02:48 阅读 我要评论

  •     (ssizeobjargproc)list_ass_item,             /* sq_ass_item */ 
  •     (ssizessizeobjargproc)list_ass_slice,       /* sq_ass_slice */ 
  •     (objobjproc)list_contains,                  /* sq_contains */ 
  •     (binaryfunc)list_inplace_concat,            /* sq_inplace_concat */ 
  •     (ssizeargfunc)list_inplace_repeat,          /* sq_inplace_repeat */ 
  • };  
  • 接下来就是一个断定, 断定咱们这个 l 对象是否有 Py_TPFLAGS_HAVE_INPLACEOPS 这个特点, 很明显是有的, 所以就调用上步取到的构造体中的 sq_inplace_concat 函数, 那接下来呢? 肯定就是看看这个函数是干嘛的:

    1. list_inplace_concat(PyListObject *self, PyObject *other) 
    2.     PyObject *result; 
    3.  
    4.     result = listextend(self, other);    # 关键地点 
    5.     if (result == NULL
    6.         return result; 
    7.     Py_DECREF(result); 
    8.     Py_INCREF(self); 
    9.     return (PyObject *)self; 
    10.  

    终于找到关键了, 本来最后就是调用这个 listextend 函数, 这个和我们 python 层面的列表的extend办法 很类似, 在这不细讲了!

    把 PyNumber_InPlaceAdd 的履行调用过程, 简单整顿下来就是:

    1. INPLACE_ADD(字节码) 
    2.     -> PyNumber_InPlaceAdd 
    3.         -> 断定是否数字: 如不雅是, 直接返回两数相加 
    4.         -> 断定是否字符串: 如不雅是, 直接返回`string_concatenate`的结不雅 
    5.         -> 都不是: 
    6.             -> binary_iop1 (断定是否数字, 如不雅是则按照数字处理, 不然返回Py_NotImplemented) 
    7.                 -> binary_iop (断定是否数字, 如不雅是则按照数字处理, 不然返回Py_NotImplemented) 
    8.             -> 返回的结不雅是否 Py_NotImplemented: 
    9.                 -> 是:  
    10.                     -> 对象是否有Py_TPFLAGS_HAVE_INPLACEOPS: 
    11.                         -> 是: 调用对象的: sq_inplace_concat 
    12.                         -> 否: 调用对象的: sq_concat 
    13.                 -> 否: 报错 

    所以在膳绫擎的结不雅, 第二种代码: l += [3,4,5] , 我们看到的 id 值并没有改变, 就是因为 +=经由过程 sq_inplace_concat  调用了列表的 listextend 函数, 然后导致新列表以追加的方法去处理.

    结论

    【编辑推荐】

    1. Python中的垃圾收受接收机制
    2. 进修Python编程的19个资本
    3. 深刻懂得Python字符串对象的实现

        推荐阅读

        NAS存储市场杀入新军 安全易用是亮点

      【51CTO.com原创稿件】2017年6月14日,杰和科技在北京国度泅水中间为了其NAS办事器新品举办了以“谋势而>>>详细阅读


      本文标题:Python源码理解: +=和 xx = xx + xx的区别

      地址:http://www.17bianji.com/lsqh/35818.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)