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中的集合类型操作符
Aug 19 Python
Python实现在线音乐播放器
Mar 03 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
Python 实现文件打包、上传与校验的方法
Feb 13 Python
PyQt QCombobox设置行高的方法
Jun 20 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 Python
python3读取文件指定行的三种方法
May 24 Python
python基础入门之字典和集合
Jun 13 Python
Python中time标准库的使用教程
Apr 13 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
资料注册后发信小技巧
2006/10/09 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
destoon之一键登录设置
2014/06/21 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
python网络编程学习笔记(六):Web客户端访问
2014/06/09 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
Python包和模块的分发详细介绍
2020/06/19 Python
pytorch SENet实现案例
2020/06/24 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
2015共产党员公开承诺书
2015/01/22 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
Python中的变量与常量
2021/11/11 Python