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 logging
Apr 15 Python
python写入并获取剪切板内容的实例
May 31 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
使用Python创建简单的HTTP服务器的方法步骤
Apr 26 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
如何利用python给图片添加半透明水印
Sep 06 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
详解Pytorch显存动态分配规律探索
Nov 17 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 Python
Python读取和写入Excel数据
Apr 20 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 Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
使用php实现截取指定长度
2013/08/06 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
php自定义错误处理用法实例
2015/03/20 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
2016/01/27 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
params有什么用
2016/03/01 面试题
日语专业毕业生求职信
2013/12/04 职场文书
优秀村官事迹材料
2014/01/10 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
交通事故和解协议书
2014/09/25 职场文书
董事长秘书工作总结
2015/08/14 职场文书
tensorflow中的数据类型dtype用法说明
2021/05/26 Python