深入理解Python中的*重复运算符


Posted in Python onOctober 28, 2017

在python中有个特殊的符号“*”,可以用做数值运算的乘法算子,也是用作对象的重复算子,但在作为重复算子使用时一定要注意

注意的是:*重复出来的各对象具有同一个id,也就是指向在内存中同一块地址,在对各个对象进行操作是一定要注意。

举例来说:

>>> alist = [range(3)]*4
>>> alist
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

上面初始化一个二层列表用来模拟矩阵,该矩阵式4X3的,为描述方便,这里记矩阵为A。

现在我想给A11赋值为1,用下面的代码:

alist[0][0]=1

那我们想要的结果应该是:

[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

可是很不幸,我们得到的是:

[[1, 1, 2], [1, 1, 2], [1, 1, 2], [1, 1, 2]]

这是怎么回事呢,为什么给A21赋值,其他的Ai1为什么都跟着变了呢?

原因是这样的:

文章开始的时候我们已经说过了,*重复出来的各对象具有同一个id,也就是指向在内存中同一块地址,在对各个对象进行操作是一定要注意。

我们再初始化的时候用了重复算子"*",这个操作符在对对象进行重复操作时,会将重复的所有对象都指向同一块内存地址,所有当你改变其中的一个值时,其他的值自然也会更新,用python的话进行解释就是下面的命令及输出:

>>> id(alist[0])
18858192
>>> id(alist[1])
18858192
>>> id(alist[2])
18858192
>>> id(alist[3])
18858192
>>>

看到了吧,id都是一样滴,也就是说这4个list是同一个“list”。

既然这样那我们想要模拟一个矩阵怎么办呢,除了有专门的numpy包之外,你当然可以给上层list逐个的append新的list,例如:

>>> blist=[]
>>> for i in range(4):
  blist.append([j for j in range(3)])
>>> blist
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

这样,我们再试试上面的赋值操作:

>>> blist[0][0]=1
>>> blist
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
>>>

总结

以上就是本文关于深入理解Python中的*重复运算符的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:13个最常用的Python深度学习库介绍、python探索之BaseHTTPServer-实现Web服务器介绍等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
使用python编写android截屏脚本双击运行即可
Jul 21 Python
python使用chardet判断字符串编码的方法
Mar 13 Python
利用QT写一个极简单的图形化Python闹钟程序
Apr 07 Python
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
python编程嵌套函数实例代码
Feb 11 Python
django将图片上传数据库后在前端显式的方法
May 25 Python
Python 中的lambda函数介绍
Oct 10 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
python滑块验证码的破解实现
Nov 10 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
Python实现实时数据采集新型冠状病毒数据实例
Feb 04 Python
Python超详细分步解析随机漫步
Mar 17 Python
13个最常用的Python深度学习库介绍
Oct 28 #Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 #Python
Python探索之实现一个简单的HTTP服务器
Oct 28 #Python
Python探索之SocketServer详解
Oct 28 #Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 #Python
Pandas探索之高性能函数eval和query解析
Oct 28 #Python
Python探索之URL Dispatcher实例详解
Oct 28 #Python
You might like
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
Javascript 入门基础学习
2010/03/10 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
对VUE中的对象添加属性
2018/09/18 Javascript
详解element-ui中form验证杂记
2019/03/04 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
Python异常学习笔记
2015/02/03 Python
python中尾递归用法实例详解
2015/04/28 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
python 实现波浪滤镜特效
2020/12/02 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
建筑人员岗位职责
2013/12/25 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
高效课堂教学反思
2016/02/24 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android