python 二维列表切片_Python中mutable与immutable和二维列表的初始化问题
初始化一个shape为(3,3)的二维列表,正确的写法是这样的:
但是,如果写成这样:
a = [[None] * 3] * 3print(a) # 输出 : [[None, None, None], [None, None, None], [None, None, None]]
看起来像是没有问题,实际上,如果进行赋值操作,就会发现问题:
a[0][0] = 1print(a) # 输出:[[1, None, None], [1, None, None], [1, None, None]]
结果三行的对应位置的元素全都改变了!(就因为这个问题找了好长时间的bug… =_=|||)
后来知道,这个问题与Python中数据类型的分类有关,所以在这里记录一下,存个档。
步入正题,在Python中有一句话:万物皆对象(好像OOP都是这么说。。),在Python中所写的一切都可以看作是一个对象,比如定义的整数、浮点数以及列表,元组等,但是这些对象也有区别,这些对象,有些属于mutable(可变),有些则是属于immutable(不可变),这是什么意思呢?先看一个例子:
# 这里定义一个整数 id()函数可以查看对象的内存位置
a = 3print(id(a))a += 1print(id(a)) #输出:# 94034634295264# 94034634295296
# 接下来定义一个列表:a = [1,2,3]print(id(a))a[0] = 100print(id(a)) # 输出:# 139637076845448# 139637076845448
通过对比,不难发现,对数值,比如整数、浮点数进行改变,内存的位置会发生改变,但是对列表,字典之类的进行改变,则不会改变内存位置。
实际上,对于整数、浮点数,改变值的时候,实际上是新开辟了一块内存,然后把加法的结果填充到这快内存中,然后再把a指向这块新的内存。
这里提到了“指向”,如果学过C或者C++,可能会想到指针或者引用,再Python中也有说引用的,那么这里就可以看出两种语言的“引用”是不同的了,C++中,对引用的数据进行改变,这个位置应该是不变的,而再Python中,显然,就像上面,相当于改变了“引用”,而不是内存的数据。
这里可能有点绕,不过这里也就是所说的mutable和immutable的问题了,在Python中,immutable的类型有整数、浮点数、字符串以及元组等等,而mutable的类型有list,dict以及自定义的类型。
那么回到上面一开始的问题中,知道了list是mutable的,所以在创建的时候,并不是赋值到了新的位置,只是创建了三个指针(a[0], a[1], a[2])指向了同一块内存而已,所以,改变其中一个的某个元素,会对所有的元素产生影响。
最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。
python 二维列表切片_Python中mutable与immutable和二维列表的初始化问题相关推荐
- python读取字典元素笔记_Python中列表、字典、元组数据结构的简单学习笔记
列表 列表是Python中最具灵活性的有序集合对象类型.与字符串不同的是,列表可以包含任何类型的对象:数字.字符串甚至其他列表.列表是可变对象,它支持原地修改的操作. Python的列表是: 任意对象 ...
- python可以使用二维元组吗_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...
怎么去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...
- python只能对列表进行切片_Python中的列表
1. 列表的创建 列表(list)是Python中一个非常重要的类型,用于管理一组数据,列表的形式如下所示 country = ['China', 'Germany', 'Russia', 'Amer ...
- python numpy数组切片_python中numpy数组切片实验解释
print(a[0::2]).a[::2].[:,2].[1:,-1:].a[::-1].[ : n].[m : ].[-1].[:-1].[1:]等的含义 文章目录 一维数组(冒号:) 1.一个参数 ...
- python 字典排序 最大键_Python中的列表、元祖、字典、集合操作大全
来源:http://suo.im/5HPGNT 在Python中有4种内建的数据结构:列表.元组.字典.集合.今天我们将会学习如何使用它们,以及它们如何使编程变得简单. 一.列表list 是处理一组有 ...
- python中字典列表元组_Python中的列表和元组
python中字典列表元组 Lists and tuples are arguably Python's most versatile, useful data types. You will fin ...
- python支付程序源码_Python提取支付宝和微信支付二维码的示例代码
支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件 ...
- python中的列表生成式_Python中的列表生成式
列表生成式 抛出一个问题,创建一个从1到100的列表,该怎么写: while li = [] i = 1 while i <= 100: li.append(i) i += 1 print(li ...
- python中列表常用方法_Python中列表的常用方法
给列表添加元素 append方法 在列表最后追加元素 l1 = ['a', 'b', 'c', 'd', ] l1.append('e')print(l1)print(l1.append('e'))# ...
最新文章
- linux中错误日志等级
- k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)
- docker api 基本介绍和使用
- 限制用户对页的访问php,如何限制对Django中管理页的访问?
- 基础算法 —— 贪心算法
- 程序员的10条黄金法则,你懂?
- linux shell删除归档_linux打怪技能方向规划,送给迷茫学习的你
- java中datetime类型转换,Java中日期格式和其他类型转换详解
- 如何在excel不同的工作表之间使用数据有效性?
- android组建之间通信_Android组件化(三)组件之间的通信
- 单频和混频是什么意思_科研| 谐波混频器常见电路小结
- python自学-Python 应该怎么学?
- 计算机图形学开发框架,计算机图形学-基于3d图形开发技术
- win10下Miracast无线投屏使用教程及异常解决方案(超详细)
- 域名卡密自助授权系统
- 【产品分析】Luckin coffee
- 不想做外包,当不了药神,AI公司如何才能走通制药这条路?
- 5.绘制统计图形——堆积图
- 关键成功因素法(CrISical Success Factors,CSF)
- c++合理利用adl来重载概念
热门文章
- 实时查看磁盘inode和block变化
- 多任务的同步与相互排斥
- mask层--- ios开发view圆角属性的layer层的实质
- spring相关资源
- 协程入门(一):启动与挂起
- Component template should contain exactly one root element---基于Vue的uniapp手机端_前端UI_uview工作笔记002
- ES6新特性_ES6语法糖_ES5中构造函数的继承---JavaScript_ECMAScript_ES6-ES11新特性工作笔记035
- 基于Spring Security的认证方式_实现认证功能_Spring Security OAuth2.0认证授权---springcloud工作笔记120
- JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池
- springCloud工作笔记090---SpringCloud_redis配置多数据源_redis多数据源