深入理解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内置函数bin() oct()等实现进制转换
Dec 30 Python
tornado框架blog模块分析与使用
Nov 21 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
Jan 29 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
python实现布隆过滤器及原理解析
Dec 08 Python
Python接口自动化判断元素原理解析
Feb 24 Python
Python实现转换图片背景颜色代码
Apr 30 Python
详解python 条件语句和while循环的实例代码
Dec 28 Python
python 实现图片裁剪小工具
Feb 02 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 Python
python lambda的使用详解
Feb 26 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 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
prototype Element学习笔记(篇二)
2008/10/26 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
简单实现JS上传图片预览功能
2017/04/14 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
Python中的装饰器用法详解
2015/01/14 Python
python函数的作用域及关键字详解
2019/08/20 Python
父亲节活动策划方案
2014/08/24 职场文书
工资证明格式模板
2015/06/12 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
关于Python使用turtle库画任意图的问题
2022/04/01 Python
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python