Python:表达式i+=x与i=i+x等价吗?-创新互联

Python 表达式i += x与i = i + x等价吗?如果你的回答是yes,那么恭喜你正确了50%,为什么说只对了一半呢? 按照我们的一般理解它们俩是等价的,整数操作时两者没什么异同,但是对于列表操作,是不是也一样呢?先看下面两段代码:

成都创新互联公司是一家集网站建设,尼玛企业网站建设,尼玛品牌网站建设,网站定制,尼玛网站建设报价,网络营销,网络优化,尼玛网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

代码1

Python:表达式 i += x 与 i = i + x 等价吗?

代码2

Python:表达式 i += x 与 i = i + x 等价吗?

代码1与代码2中的l2的值是一样的,但是l1的值却不一样,说明i += x与i = i + x是不等价的,那什么情况下等价,什么情况下不等价呢?

弄清楚这个问题之前,选得明白两个概念:可变对象与不可变对象。

在 Python 中任何对象都有的三个通用属性:唯一标识、类型、值。

唯一标识:用于标识对象的在内存中唯一性,它在对象创建之后就不会再改变,函数id()可以查看对象的唯一标识

类型:决定了该对象支持哪些操作,不同类型的对象支持的操作就不一样,比如列表可以有length属性,而整数没有。同样地对象的类型一旦确定了就不会再变,函数type()可以返回对象的类型信息。

对象的值与唯一标识不一样,并不是所有的对象的值都是一成不变的,有些对象的值可以通过某些操作发生改变,值可以变化的对象称之为可变对象(mutable),值不能改变的对象称之为不可变对象(immutable)

不可变对象(immutable)

对于不可变对象,值永远是刚开始创建时候的值,对该对象做的任何操作都会导致一个新的对象的创建。

Python:表达式 i += x 与 i = i + x 等价吗?

整数 “1” 是一个不可变对象,最初赋值的时候,a指向的是整数对象 1 ,但对变量a执行+=操作后, a 指向另外一个整数对象 2 ,但对象 1 还是在那里没有发生任何变化,而 变量 a 已经指向了一个新的对象2。常见的不可变对象有:int、tuple、set、str。

Python:表达式 i += x 与 i = i + x 等价吗?

可变对象(mutable)

可变对象的值可以通过某些操作动态的改变,比如列表对象,可以通过append方法不断地往列表中添加元素,该列表的值就在不断的处于变化中,一个可变对象赋值给两个变量时,他们共享同一个实例对象,指向相同的内存地址,对其中任何一个变量操作时,同时也会影响另外一个变量。

Python:表达式 i += x 与 i = i + x 等价吗?

Python:表达式 i += x 与 i = i + x 等价吗?

执行append操作后,对象的内存地址不会改变,x、y 依然指向的是原来同一个对象,只不过是他的值发生了变化而已。

Python:表达式 i += x 与 i = i + x 等价吗?

理解完可变对象与不可变对象后,回到问题本身,+=与+的区别在哪里呢?

+= 操作首先会尝试调用对象的 __iadd__方法,如果没有该方法,那么尝试调用__add__方法,先来看看这两个方法有什么区别

__add__和__iadd__的区别

__add__ 方法接收两个参数,返回它们的和,两个参数的值均不会改变。

__iadd__ 方法同样接收两个参数,但它是属于 in-place 操作,就是说它会改变第一个参数的值,因为这需要对象是可变的,所以对于不可变对象没有__iadd__方法。

Python:表达式 i += x 与 i = i + x 等价吗?

显然,整数对象是没有__iadd__的,而列表对象提供了__iadd__方法。

>>> l2 += [3]#代码1:使用__iadd__,l2的值原地修改

代码1中的 += 操作调用的是__iadd__方法,他会原地修改l2指向的那个对象本身的值

Python:表达式 i += x 与 i = i + x 等价吗?

>>> l2 = l2 + [3]# 代码2:调用 __add__,创建了一个新的列表,赋值给了l2

而代码2中的 + 操作调用的是 __add__方法,该方法会返回一个新的对象,原来的对象保持不变,l1还是指向原来的对象,而l2已经指向一个新的对象。

Python:表达式 i += x 与 i = i + x 等价吗?

以上就是表达式 i += x 与 i = i + x 的区别。因此对于列表进行 += 操作时,会存在潜在的bug,因为l1会因为l2的变化而发生改变,就像函数的参数不宜使用可变对象作为关键字参数一样。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

标题名称:Python:表达式i+=x与i=i+x等价吗?-创新互联
URL标题:https://www.cdcxhl.com/article24/cegdje.html

成都网站建设公司_创新互联,为您提供网页设计公司静态网站面包屑导航手机网站建设自适应网站品牌网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站建设