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程序中的实现及简单改进
May 04 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
Python中join函数简单代码示例
Jan 09 Python
对python 矩阵转置transpose的实例讲解
Apr 17 Python
python flask解析json数据不完整的解决方法
May 26 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
Python3爬虫里关于代理的设置总结
Jul 30 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
Python实现Word文档转换Markdown的示例
Dec 22 Python
python requests模块的使用示例
Apr 07 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
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
js拦截alert对话框另类应用
2013/01/16 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
教大家使用Python SqlAlchemy
2016/02/12 Python
python常见的格式化输出小结
2016/12/15 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
python GUI计算器的实现
2020/10/09 Python
Nike瑞士官网:Nike CH
2021/01/18 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
项目经理的岗位职责
2013/11/23 职场文书
经销商会议欢迎词
2014/01/11 职场文书
运动会广播稿80字
2014/01/23 职场文书
会务接待方案
2014/02/27 职场文书
现场施工员岗位职责
2014/03/10 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
班级活动总结格式
2014/08/30 职场文书
爱心捐助活动总结
2015/05/09 职场文书
毕业酒会致辞
2015/07/29 职场文书
新郎新娘致辞
2015/07/31 职场文书
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
python turtle绘图命令及案例
2021/11/23 Python