Python增强赋值和共享引用注意事项小结


Posted in Python onMay 28, 2019

概述

Python中的增强赋值是从C语言中借鉴出来的,所以这些格式的用法大多和C一致,本身就是对表达式的简写,即二元表达式和赋值语句的结合,比如a += b 和a = a + b 就是一致的,比如还有以下的增强赋值语句。

- - - -
a += b a &= b a -= b a |= b
a *= b a ^= b a /= b a >>=b
a %= b a a **= b a //=b

即增强赋值语句适用于任何支持隐式二元表达式的类型,比如“+”的多态:数字的相加和字符串的合并

数字加减

a = 1
a = a + 1
print(str(a))
a += 1
print(str(a))

示例结果:

2
3

字符串合并

S = 'I'
S = S + ' like '
print(S)
S += 'Python.'
print(S)

示例结果:

I like
I like Python.

优点

  • 简洁
  • 减少一次a的执行,执行速度更快
  • 针对可变对象,增强赋值会自动选择执行原处的修改运算,而不是速度更慢的复制。这就引申出我们在可变对象中可能涉及的共享引用问题。

共享引用

当我们想要扩展列表时,比如将一组元素添加到末尾,我们会怎么做?

L = [1, 2, 3]
# 传统“+”法
L = L + [4, 5]
print(L)
# 利用列表方法extend
L.extend([6, 7])
print(L)

示例结果

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6, 7]

示例中第一中“+”法,即采用合并的方法,需要新创建一个对象把左侧的L复制到新列表中,然后再[4, 5]复制到新列表中。而第二种extend则是直接在内存空间列表L末尾L加上[4, 5],即速度会更快,增强赋值则是自动采用的第二种即L.extend([6, 7])和L += [6, 7]是等价的,也是最优的选择。这种合并方式虽然快,但对于可变对象的共享引用则会变的棘手些。

L1 = [1, 2, 3]
L2 = L1
L2 = L2 + [4, 5]
print(L2)
print(L1)

print('-' * 21)

L1 = [1, 2, 3]
L2 = L1
L2 += [4, 5]
print(L2)
print(L1)

示例结果:

[1, 2, 3, 4, 5]
[1, 2, 3]
---------------------
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

我们可以从示例中看到如果同一个可变对象赋值了多个变量,那么在破坏共享引用结构时,就应该对可变对象拷贝后在进行操作。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python的几种开发工具介绍
Mar 07 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
Python读写/追加excel文件Demo分享
May 03 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
详解Python 4.0 预计推出的新功能
Jul 26 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
Python递归及尾递归优化操作实例分析
Feb 01 Python
python3.8.1+selenium实现登录滑块验证功能
May 22 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
Python实现七个基本算法的实例代码
Oct 08 Python
Python 高级库15 个让新手爱不释手(推荐)
May 15 Python
Django框架用户注销功能实现方法分析
May 28 #Python
Django框架首页和登录页分离操作示例
May 28 #Python
Django框架封装外部函数示例
May 28 #Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 #Python
python利用多种方式来统计词频(单词个数)
May 27 #Python
numpy中的ndarray方法和属性详解
May 27 #Python
numpy.linspace函数具体使用详解
May 27 #Python
You might like
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
php json转换相关知识(小结)
2018/12/21 PHP
php无限极分类实现方法分析
2019/07/04 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
2010/06/28 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
删除节点的jquery代码
2014/01/13 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
Python实现带百分比的进度条
2016/06/28 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
python根据url地址下载小文件的实例
2018/12/18 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
Python模块 _winreg操作注册表
2020/02/05 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
给面试官的感谢信
2014/02/01 职场文书
个人求职意向书
2015/05/11 职场文书
追悼会悼词大全
2015/06/23 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
详解运行Python的神器Jupyter Notebook
2021/06/03 Python