深入理解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 实现文件的递归拷贝实现代码
Aug 02 Python
python操作MongoDB基础知识
Nov 01 Python
python使用reportlab画图示例(含中文汉字)
Dec 03 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
解决Django模板无法使用perms变量问题的方法
Sep 10 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
TensorFlow实现创建分类器
Feb 06 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
Python实现的栈、队列、文件目录遍历操作示例
May 06 Python
python根据多个文件名批量查找文件
Aug 13 Python
jupyter notebook 的工作空间设置操作
Apr 20 Python
Python 的 sum() Pythonic 的求和方法详细
Oct 16 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页面中文乱码分析
2013/10/29 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
用javascript获取textarea中的光标位置
2008/05/06 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
移动端界面的适配
2017/01/11 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
Python中的类与对象之描述符详解
2015/03/27 Python
python的格式化输出(format,%)实例详解
2018/06/01 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
写出二分查找算法的两种实现
2013/05/13 面试题
大学军训感言200字
2014/02/26 职场文书
六查六看六改心得体会
2014/10/14 职场文书
平安建设汇报材料
2014/12/29 职场文书
爱心捐书倡议书
2015/04/27 职场文书
交通事故调解协议书
2015/05/20 职场文书
公司开业主持词
2015/07/02 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers