深入理解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实现端口转发器的方法
Mar 13 Python
python自定义类并使用的方法
May 07 Python
详解Python中break语句的用法
May 14 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
python中reader的next用法
Jul 24 Python
python 检查文件mime类型的方法
Dec 08 Python
python字典的遍历3种方法详解
Aug 10 Python
vue常用指令代码实例总结
Mar 16 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
Jun 15 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
深入理解Pytorch微调torchvision模型
Nov 11 Python
Python利用FlashText算法实现替换字符串
Mar 31 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 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
php cout<<的一点看法
2010/01/24 PHP
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
成人教育自我鉴定
2013/11/01 职场文书
2014自主招生自荐信策略
2014/01/27 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
对标管理实施方案
2014/03/12 职场文书
幼儿园标语大全
2014/06/19 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
毕业证明模板
2015/06/19 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript