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 相关文章推荐
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
Python logging模块用法示例
Aug 28 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
linux环境中没有网络怎么下载python
Jul 07 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
python UDF 实现对csv批量md5加密操作
Jan 01 Python
Python3.9.1中使用match方法详解
Feb 08 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 透明水印生成代码
2012/08/27 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
php实现的农历算法实例
2015/08/11 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
Jquery根据浏览器窗口改变调整大小的方法
2017/02/07 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python实现向QQ群成员自动发邮件的方法
2014/11/19 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
python的flask框架难学吗
2020/07/31 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
什么是View State?
2013/01/27 面试题
商务专员岗位职责
2013/11/23 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
会计工作岗位职责
2015/02/03 职场文书
搞笑结婚保证书
2015/05/08 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python