接下来就是一个断定, 断定咱们这个 l 对象是否有 Py_TPFLAGS_HAVE_INPLACEOPS 这个特点, 很明显是有的, 所以就调用上步取到的构造体中的 sq_inplace_concat 函数, 那接下来呢? 肯定就是看看这个函数是干嘛的:
- list_inplace_concat(PyListObject *self, PyObject *other)
- {
- PyObject *result;
- result = listextend(self, other); # 关键地点
- if (result == NULL)
- return result;
- Py_DECREF(result);
- Py_INCREF(self);
- return (PyObject *)self;
- }
终于找到关键了, 本来最后就是调用这个 listextend 函数, 这个和我们 python 层面的列表的extend办法 很类似, 在这不细讲了!
把 PyNumber_InPlaceAdd 的履行调用过程, 简单整顿下来就是:
- INPLACE_ADD(字节码)
- -> PyNumber_InPlaceAdd
- -> 断定是否数字: 如不雅是, 直接返回两数相加
- -> 断定是否字符串: 如不雅是, 直接返回`string_concatenate`的结不雅
- -> 都不是:
- -> binary_iop1 (断定是否数字, 如不雅是则按照数字处理, 不然返回Py_NotImplemented)
- -> binary_iop (断定是否数字, 如不雅是则按照数字处理, 不然返回Py_NotImplemented)
- -> 返回的结不雅是否 Py_NotImplemented:
- -> 是:
- -> 对象是否有Py_TPFLAGS_HAVE_INPLACEOPS:
- -> 是: 调用对象的: sq_inplace_concat
- -> 否: 调用对象的: sq_concat
- -> 否: 报错
所以在膳绫擎的结不雅, 第二种代码: l += [3,4,5] , 我们看到的 id 值并没有改变, 就是因为 +=经由过程 sq_inplace_concat 调用了列表的 listextend 函数, 然后导致新列表以追加的方法去处理.
结论
【编辑推荐】
- Python中的垃圾收受接收机制
- 进修Python编程的19个资本
- 深刻懂得Python字符串对象的实现
推荐阅读
【51CTO.com原创稿件】2017年6月14日,杰和科技在北京国度泅水中间为了其NAS办事器新品举办了以“谋势而>>>详细阅读
本文标题:Python源码理解: +=和 xx = xx + xx的区别
地址:http://www.17bianji.com/lsqh/35818.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示