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使用arrow库优雅地处理时间数据详解
Oct 10 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
Windows环境下python环境安装使用图文教程
Mar 13 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
Python从函数参数类型引出元组实例分析
May 28 Python
解决python文件双击运行秒退的问题
Jun 24 Python
python读写配置文件操作示例
Jul 03 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 Python
python实现把两个二维array叠加成三维array示例
Nov 29 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 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脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
js 通用订单代码
2013/12/23 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
浅谈python可视化包Bokeh
2018/02/07 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
关于Java String的一道面试题
2013/09/29 面试题
教师年终个人自我评价
2013/10/04 职场文书
医药工作岗位求职信分享
2013/12/31 职场文书
财务情况说明书范文
2014/05/06 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书