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+OpenCV让电脑帮你玩微信跳一跳
Jan 04 Python
Php多进程实现代码
May 07 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
Python中__slots__属性介绍与基本使用方法
Sep 05 Python
python读取和保存图片5种方法对比
Sep 12 Python
python字典值排序并取出前n个key值的方法
Oct 17 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
set在python里的含义和用法
Jun 24 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
python中rc1什么意思
Jun 19 Python
教你怎么用Python操作MySql数据库
May 31 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中使用Oracle数据库(4)
2006/10/09 PHP
php实现的双向队列类实例
2014/09/24 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
2015/01/26 Javascript
javascript常用方法总结
2015/05/14 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
两种方法解决javascript url post 特殊字符转义 + & #
2016/04/13 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
Python PIL库图片灰化处理
2020/04/07 Python
jupyter实现重新加载模块
2020/04/16 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
电气自动化个人求职信范文
2014/02/03 职场文书
质量月口号
2014/06/20 职场文书
实习协议书
2015/01/27 职场文书
工作会议通知
2015/04/15 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技