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数据类型详解(四)字典:dict
May 12 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
python实现简易动态时钟
Nov 19 Python
Python删除n行后的其他行方法
Jan 28 Python
Python循环结构的应用场景详解
Jul 11 Python
python3.7 的新特性详解
Jul 25 Python
Python3进制之间的转换代码实例
Aug 24 Python
python 通过手机号识别出对应的微信性别(实例代码)
Dec 22 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
详解Python中第三方库Faker
Sep 25 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
python实现图像随机裁剪的示例代码
Dec 10 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
Home Coffee Roasting
2021/03/03 咖啡文化
phpwind中的数据库操作类
2007/01/02 PHP
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
python中list常用操作实例详解
2015/06/03 Python
python比较两个列表是否相等的方法
2015/07/28 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
python实现事件驱动
2018/11/21 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
Python递归及尾递归优化操作实例分析
2020/02/01 Python
学习Python列表的基础知识汇总
2020/03/10 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
Python 内存管理机制全面分析
2021/01/16 Python
远程调用的原理
2014/07/05 面试题
学生自我鉴定范文
2013/10/04 职场文书
电子专业毕业生自我鉴定
2014/01/22 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
MySQL的索引你了解吗
2022/03/13 MySQL