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 13 Python
Python实现处理管道的方法
Jun 04 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
Python实现Kmeans聚类算法
Jun 10 Python
selenium在执行phantomjs的API并获取执行结果的方法
Dec 17 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 Python
总结Python图形用户界面和游戏开发知识点
May 22 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
python之生产者消费者模型实现详解
Jul 27 Python
python爬虫中url管理器去重操作实例
Nov 30 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合并数组+与array_merge的区别分析
2010/08/01 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
Python3实现从指定路径查找文件的方法
2015/05/22 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
简单了解python反射机制的一些知识
2019/07/13 Python
python使用minimax算法实现五子棋
2019/07/29 Python
python 实现多维数组转向量
2019/11/30 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
指导教师推荐意见
2015/06/05 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫
Elasticsearch 索引操作和增删改查
2022/04/19 Python