Python中表达式x += y和x = x+y 的区别详解
作者:hooog 发布时间:2022-02-24 04:11:19
标签:python,表达式
前言
本文主要给大家介绍的是关于Python中表达式x += y和x = x+y 区别的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:
直接看下面代码:
x +=y
In [66]: id(a)
Out[66]: 4476839480
In [67]: id(b)
Out[67]: 4476839480
In [68]: a = [1, 2, 3]
In [69]: b = a
In [70]: id(a)
Out[70]: 4477149984
In [71]: id(b)
Out[71]: 4477149984
In [72]: a += [4, 5, 6]
In [73]: a
Out[73]: [1, 2, 3, 4, 5, 6]
In [74]: b
Out[74]: [1, 2, 3, 4, 5, 6]
In [75]: id(a)
Out[75]: 4477149984
In [76]: id(b)
Out[76]: 4477149984
x = x + y
In [77]: a = [1, 2, 3]
In [78]: b = a
In [79]: id(a)
Out[79]: 4476686208
In [80]: id(b)
Out[80]: 4476686208
In [81]: a = a + [4, 5, 6]
In [82]: a
Out[82]: [1, 2, 3, 4, 5, 6]
In [83]: b
Out[83]: [1, 2, 3]
In [84]: id(a)
Out[84]: 4477187640
In [85]: id(b)
Out[85]: 4476686208
可以看出对于可变对象而言 x = x + y 这种形式已经改变了x的指向,而不是"inplace"的修改。
使用dis模块进行一下验证。
In [86]: def foo(x, y):
...: x += y
...: return x
...:
In [87]: def foo(x, y):
...: x += y
...:
In [88]: def foo2(x, y):
...: x = x + y
...:
In [89]: dis.dis(foo)
2 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 INPLACE_ADD
7 STORE_FAST 0 (x)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
In [90]: dis.dis(foo2)
2 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 BINARY_ADD
7 STORE_FAST 0 (x)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
可以看到字节码是不同的:
+= 对应 INPLACE_ADD
对应BINARY_ADD
注意:以上仅适用于CPython实现。
来源:https://hooog.tk/posts/inplace-binary-add/


猜你喜欢
- 首先来聊聊Vue框架,Vue是一套用于构建用户界面的渐进式的JavaScript框架,对于初学者来说是非常友好的 , Vue的虚拟Dom ,
- 背景最近在需求中有一个这样的场景:需要在页面关闭的时候,用户不需要操作,主动关闭当前订单当时考虑的方案:在页面关闭的时候,向后端发送一个请求
- 在使用FCKeditor的时候,可能会碰到以下这个问题,就是在编辑器页面出错,提示为:找不到页面/fckeditor/editor/fcke
- 今天下午,低一度博客受到攻击了,出现了大约一个小时的访问异常。庆幸的是,这帮无耻歹徒没能成功获取我的Access数据库,而只是象征性地给我注
- golang中GOPATH的简单理解 1、为什么要配置GOPATH配置GOPATH的用意是为了方便项目的部署和构建,以及可以直接使用go g
- 最近在处理Qzone黄钻图标更新时,想起近期对业务图标进行优化所遇到的一些问题,把思绪收拾起来和大家一共探讨,欢迎多方声音。在实际工作中,图
- 一、背景 最近系统线上数据库数据出现一个问题,发现某些字段存在一些异常的首尾空格,不管
- 关于string的split 和 join 方法对导入os模块进行os.path.splie()/os.path.join() 貌似是处理机
- 如下所示:# coding = utf-8import ospath = "D:\\chunyu"#想要重命名所有文件存
- Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码
- 目录项目地址:1) 启动方法2) web查看方法3) 功能说明:4) 展示:代码项目地址:https://github.com/guodon
- 详解Python MD5加密Python 3下MD5加密# 由于MD5模块在python3中被移除# 在python3中使用hashlib模
- 本文仅仅梳理最基本的绘图方法。一、初始化假设已经安装了matplotlib工具包。利用matplotlib.figure.Figure创建一
- matplotlib从1.1.0版本以后就开始支持绘制动画下面是几个的示例:第一个例子使用generator,每隔两秒,就运行函数data_
- Javascript 选择器(selector engine)似乎从 jQuery 流行以来就大行其道,改变了原有 Javascript 选
- 一、项目需求爬取排行榜小说的作者,书名,分类以及完结或连载二、项目分析目标url:“https://www.qidian.com/rank/
- 本文实例讲述了Python实现简单拆分PDF文件的方法。分享给大家供大家参考。具体如下:依赖pyPdf处理PDF文件切分pdf文件使用方法:
- 一、现状Python 有诸多优秀的 Web 开发框架供我们使用,比如Django、Flask、Sanic。正常的情况下,我们基于这些 Web
- 用过Qt的朋友 特别是QtCreator的习惯在界面UI上面对应的CPP中写代码。但是在PyQt中不是这样的。pyQt只是个界面,只会生成界
- 前言这几天看《流畅的python》这本书了,在一个示例中又看到了property作为装饰器在使用,因为很久没有用这个东西了,对它