深入理解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实现dnspod自动更新dns解析的方法
Feb 14 Python
Python中 Lambda表达式全面解析
Nov 28 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
Python Django框架单元测试之文件上传测试示例
May 17 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
Jan 28 Python
Python线程threading模块用法详解
Feb 26 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
使用Python+Appuim 清理微信的方法
Jan 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
将二维数组转为一维数组的2种方法
2014/05/26 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
PHP设置进度条的方法
2015/07/08 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
Javascript 作用域使用说明
2009/08/13 Javascript
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
财务主管自我鉴定
2014/01/17 职场文书
会计核算科岗位职责
2014/03/19 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
导游词范文
2015/02/13 职场文书
毕业证明书
2015/06/19 职场文书
新年祝酒词大全
2015/08/11 职场文书
小学数学国培研修日志
2015/11/13 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏