深入理解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使用post提交数据到远程url的方法
Apr 29 Python
Python下载指定页面上图片的方法
May 12 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
Django进阶之CSRF的解决
Aug 01 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
python 实现简单的FTP程序
Dec 27 Python
python如何求数组连续最大和的示例代码
Feb 04 Python
用Python做一个久坐提醒小助手的示例代码
Feb 10 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
python调用win32接口进行截图的示例
Nov 11 Python
详解Python中的Lock和Rlock
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
一个简单且很好用的php分页类
2013/10/26 PHP
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
smarty中js的调用方法示例
2014/10/27 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
js实现旋转木马效果
2017/03/17 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
在Django的模型中添加自定义方法的示例
2015/07/21 Python
Python实现简单拆分PDF文件的方法
2015/07/30 Python
python实现求最长回文子串长度
2018/01/22 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python3 log10()函数简单用法
2019/02/19 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
Python实现不规则图形填充的思路
2020/02/02 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
python和php哪个容易学
2020/06/19 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
会务接待方案
2014/02/27 职场文书
2014庆六一活动方案
2014/03/02 职场文书
教学反思怎么写
2016/02/24 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP