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实现在Linux系统下更改当前进程运行用户
Feb 04 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
Jul 30 Python
浅谈python抛出异常、自定义异常, 传递异常
Jun 20 Python
python Flask实现restful api service
Dec 04 Python
Python排序搜索基本算法之希尔排序实例分析
Dec 09 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
Jan 17 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
python使用Matplotlib改变坐标轴的默认位置
Oct 18 Python
浅析PyCharm 的初始设置(知道)
Oct 12 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 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
教你如何把一篇文章按要求分段
2006/10/09 PHP
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
event对象的方法 兼容多浏览器
2009/06/27 Javascript
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
jQuery选择器之基本选择器与层次选择器
2015/03/03 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
Python实现最常见加密方式详解
2019/07/13 Python
Python 可视化神器Plotly详解
2020/12/26 Python
python实现ping命令小程序
2020/12/28 Python
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
如何选择使用结构还是类
2014/05/30 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
党员教师群众路线对照检查材料思想汇报
2014/09/29 职场文书
工伤私了协议书范本
2014/11/24 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
新教师教学工作总结
2015/08/14 职场文书
入党申请书格式
2019/06/20 职场文书