Python中表达式x += y和x = x+y 的区别详解


Posted in Python onJune 20, 2017

前言

本文主要给大家介绍的是关于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实现。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
对python中raw_input()和input()的用法详解
Apr 22 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
Python实现插入排序和选择排序的方法
May 12 Python
ipad上运行python的方法步骤
Oct 12 Python
python使用正则来处理各种匹配问题
Dec 22 Python
Python使用sqlite3模块内置数据库
May 07 Python
python爬虫基础知识点整理
Jun 02 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
python如何随机生成高强度密码
Aug 19 Python
Prometheus开发中间件Exporter过程详解
Nov 30 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
回调函数的意义以及python实现实例
Jun 20 #Python
Python处理Excel文件实例代码
Jun 20 #Python
python构建自定义回调函数详解
Jun 20 #Python
Python实现完整的事务操作示例
Jun 20 #Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 #Python
Python实现多并发访问网站功能示例
Jun 19 #Python
Python sqlite3事务处理方法实例分析
Jun 19 #Python
You might like
一个php作的文本留言本的例子(二)
2006/10/09 PHP
php读取excel文件的简单实例
2013/08/26 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
jquery遍历input取得input的name
2009/04/27 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
解决vue项目获取dom元素宽高总是不准确问题
2020/07/29 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
[08:40]Navi Vs Newbee
2018/06/07 DOTA
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
在Django中创建动态视图的教程
2015/07/15 Python
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
python面向对象法实现图书管理系统
2019/04/19 Python
Python求解正态分布置信区间教程
2019/11/20 Python
简述python Scrapy框架
2020/08/17 Python
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
出纳员的岗位职责
2014/02/22 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
婚前协议书范本
2014/04/15 职场文书
创先争优活动个人总结
2015/03/04 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
python基础之模块的导入
2021/10/24 Python