前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python运算符+与+=的那些事

Python运算符+与+=的那些事

作者头像
Python小屋屋主
发布2018-04-16 16:21:49
7080
发布2018-04-16 16:21:49
举报
文章被收录于专栏:Python小屋Python小屋

这两个运算符很多语言都提供了,好像也没啥好说的,不就是像下面这样子用嘛。

>>> x = 3 >>> y = x+6 >>> y 9 >>> x += 6 >>> x 9

+运算符得到新对象,当然也可以在原对象值的基础上进行增加,例如x = x+6;而+=总是修改原来的对象值。

但如果深入研究的话,情况似乎还是有些出乎意料的,看下面的代码:

>>> x = 3 >>> id(x) 1494131872 >>> x += 6 >>> id(x) 1494132064

其中内置函数id()用来返回一个对象的内存地址。那么上面的代码说明了什么呢?执行+=运算之后,x的内置地址发生了变化。究其原因,在于Python采用的是基于值的自动内存管理模式。变量中不直接存储值,而是存储值的引用,也就是值在内存中的地址。上面代码的执行过程如图所示,在执行x += 6时,首先把原来的3取出来,加上6得到9,把9放到内存中,最后再让x来指向这个新地址。

然而,当+和+=作用于列表时,情况又有所不同。

>>> x = [1, 2, 3] >>> id(x) 1668306802824 >>> x = x + [4] >>> id(x) 1668306565768 >>> x += [5] >>> id(x) 1668306565768

发现了什么?+=作用于列表时居然是原地操作,类似于列表的append()方法。确实是这样的。在类的设计中,特殊方法__iadd__()对应于+=运算符,而+运算符则对应于特殊方法__add__(),有例为证:

>>> class Test: def __init__(self, v): self.__value = [v] def __add__(self, vv): return Test(self.__value[0] + vv) def __iadd__(self, vv): self.__value.append(vv) return self def show(self): return self.__value

>>> t = Test(3) >>> t.show() [3] >>> id(t) 1668306894744 >>> tt = t+6 >>> tt.show() [9] >>> id(tt) 1668306197640 >>> t += 6 >>> t.show() [3, 6] >>> id(t) 1668306894744

既然这样的话,那么列表对象的+=也就是__iadd__()会设计成什么样子,就都是可以理解的了。

最后,如果元组中含有子列表,+=会有一个坑,详见Python编程中一定要注意的那些“坑”(一)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档