深入理解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中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
python中字符串前面加r的作用
Jun 04 Python
Python基于PycURL自动处理cookie的方法
Jul 25 Python
Python selenium 三种等待方式详解(必会)
Sep 15 Python
python 链接和操作 memcache方法
Mar 04 Python
python3 shelve模块的详解
Jul 08 Python
python matlibplot绘制多条曲线图
Feb 19 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
python实现淘宝购物系统
Oct 25 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
PyQT5 emit 和 connect的用法详解
Dec 13 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
帝国cms常用标签汇总
2015/07/06 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
Javascript的构造函数和constructor属性
2010/01/09 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
python判断windows隐藏文件的方法
2014/03/21 Python
Python中decorator使用实例
2015/04/14 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
django foreignkey(外键)的实现
2019/07/29 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python datetime处理时间小结
2020/04/16 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
环境工程大学生个人的自我评价
2013/10/08 职场文书
英文版餐饮业求职信
2013/10/18 职场文书
土木工程毕业生自荐信
2013/11/12 职场文书
小学运动会口号
2014/06/07 职场文书
2015年领导干部廉洁自律工作总结
2015/05/26 职场文书
离婚民事起诉状
2015/08/03 职场文书
值班管理制度范本
2015/08/06 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL