深入理解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 时间操作例子和时间格式化参数小结
Apr 24 Python
python输出当前目录下index.html文件路径的方法
Apr 28 Python
总结Python编程中三条常用的技巧
May 11 Python
python爬虫实战之最简单的网页爬虫教程
Aug 13 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
python属于软件吗
Jun 18 Python
python爬虫中PhantomJS加载页面的实例方法
Nov 12 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
Python中的套接字编程是什么?
Jun 21 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
利用PHP和AJAX创建RSS聚合器的代码
2007/03/13 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
javascript 对象的定义方法
2007/01/10 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
python中解析json格式文件的方法示例
2017/05/03 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
python删除字符串中指定字符的方法
2018/08/13 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
成品仓管员岗位职责
2013/12/11 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书
新法人代表任命书
2014/06/06 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
教师节联欢会主持词
2015/07/04 职场文书
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS
Java异常体系非正常停止和分类
2022/06/14 Java/Android