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运行效率的方法之间的对比
Apr 03 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
python添加模块搜索路径方法
Sep 11 Python
Django如何实现内容缓存示例详解
Sep 24 Python
Pycharm更换python解释器的方法
Oct 29 Python
在pandas多重索引multiIndex中选定指定索引的行方法
Nov 16 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
python基于json文件实现的gearman任务自动重启代码实例
Aug 13 Python
Python函数式编程实例详解
Jan 17 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
Jupyter notebook 不自动弹出网页的解决方案
May 21 Python
python脚本框架webpy模板赋值实现
Nov 20 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生成简单的验证码
2016/06/01 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
动态表格Table类的实现
2009/08/26 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
Javascript中的异步编程规范Promises/A详细介绍
2014/06/06 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
js微信分享API
2020/10/11 Javascript
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
详解小程序云开发攻略(解决最棘手的问题)
2019/09/30 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
Python实现二叉搜索树
2016/02/03 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python logging模块handlers用法详解
2020/08/14 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
酒店门卫岗位职责
2013/12/29 职场文书
运动会宣传口号
2014/06/09 职场文书
小学家长学校培训材料
2014/08/24 职场文书
入股合作协议书
2014/10/12 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers