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实现批量获取指定文件夹下的所有文件的厂商信息
Sep 28 Python
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
归纳整理Python中的控制流语句的知识点
Apr 14 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
python and or用法详解
Jun 26 Python
Python Django 命名空间模式的实现
Aug 09 Python
python实现猜数字游戏
Mar 25 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
Apr 17 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 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
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
基于Zookeeper的使用详解
2013/05/02 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
使用angular写一个hello world
2015/01/23 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
vue-next/runtime-core 源码阅读指南详解
2019/10/25 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
在Python中使用第三方模块的教程
2015/04/27 Python
Python绘制股票移动均线的实例
2019/08/24 Python
python实现微信打飞机游戏
2020/03/24 Python
如何解决python多种版本冲突问题
2020/10/13 Python
Django admin组件的使用
2020/10/24 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
大学生学习自我评价
2014/01/13 职场文书
经典促销广告词大全
2014/03/19 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
2015年车间主任工作总结
2015/05/21 职场文书