深入理解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搭建简易服务器分析与实现
Dec 15 Python
下载安装setuptool和pip linux安装pip    
Jan 24 Python
python每隔N秒运行指定函数的方法
Mar 16 Python
pygame学习笔记(4):声音控制
Apr 15 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
python 删除非空文件夹的实例
Apr 26 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
python3操作注册表的方法(Url protocol)
Feb 05 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
Python 分布式缓存之Reids数据类型操作详解
Jun 24 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
Jul 01 Python
python脚本框架webpy模板赋值实现
Nov 20 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中使用Oracle数据库(1)
2006/10/09 PHP
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
php引用传值实例详解学习
2013/11/06 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
javascript背投广告代码的完善
2008/04/08 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
Python中集合类型(set)学习小结
2015/01/28 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
Python 处理文件的几种方式
2019/08/23 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
房产委托公证书样本
2014/04/04 职场文书
2014年采购工作总结
2014/11/20 职场文书
学校标语口号大全
2015/12/26 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
java泛型通配符详解
2021/07/25 Java/Android