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构建Hopfield网络的教程
Apr 14 Python
使用Python & Flask 实现RESTful Web API的实例
Sep 19 Python
关于Tensorflow中的tf.train.batch函数的使用
Apr 24 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
python安装本地whl的实例步骤
Oct 12 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
python 求定积分和不定积分示例
Nov 20 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
Apr 26 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 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 命令行参数详解及应用
2011/05/18 PHP
php修改时间格式的代码
2011/05/29 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
接收键盘指令的脚本
2006/06/26 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
python绘制简单折线图代码示例
2017/12/19 Python
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
Pycharm github配置实现过程图解
2020/10/13 Python
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
触摸春天教学反思
2014/02/03 职场文书
学生会干部自荐信
2014/02/04 职场文书
《争吵》教学反思
2014/02/15 职场文书
自荐信如何制作?
2014/02/21 职场文书
投标承诺函格式
2015/01/21 职场文书
2016党校培训心得体会
2016/01/07 职场文书