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
Python面向对象编程中的类和对象学习教程
Mar 30 Python
使用Python实现一个简单的项目监控
Mar 31 Python
python实现隐马尔科夫模型HMM
Mar 25 Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 Python
python多线程抽象编程模型详解
Mar 20 Python
使用python模拟命令行终端的示例
Aug 13 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
Apr 15 Python
在keras 中获取张量 tensor 的维度大小实例
Jun 10 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
Python 中random 库的详细使用
Jun 03 Python
Python创建SQL数据库流程逐步讲解
Sep 23 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
用session做客户验证时的注意事项
2006/10/09 PHP
php 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
MooTools 1.2介绍
2009/09/14 Javascript
picChange 图片切换特效的函数代码
2010/05/06 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
区三好学生主要事迹
2014/01/30 职场文书
四查四看剖析材料
2014/02/14 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
2016党校培训心得体会
2016/01/07 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang