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实现国外赌场热门游戏Craps(双骰子)
Mar 31 Python
Windows下为Python安装Matplotlib模块
Nov 06 Python
Python实现感知机(PLA)算法
Dec 20 Python
python numpy 显示图像阵列的实例
Jul 02 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 Python
python的launcher用法知识点总结
Aug 07 Python
Python matplotlib模块及柱状图用法解析
Aug 10 Python
分享一个python的aes加密代码
Dec 22 Python
python实现定时发送邮件
Dec 23 Python
用Python将库打包发布到pypi
Apr 13 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中设置多级目录session的问题
2011/08/08 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
python笔记:mysql、redis操作方法
2017/06/28 Python
python之Character string(实例讲解)
2017/09/25 Python
Python实现简单的语音识别系统
2017/12/13 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
事业单位接收函
2014/01/10 职场文书
家长通知书教师评语
2014/04/17 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
盲山观后感
2015/06/11 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA
python manim实现排序算法动画示例
2022/08/14 Python