初始化一个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和二维列表的初始化问题相关推荐

  1. python读取字典元素笔记_Python中列表、字典、元组数据结构的简单学习笔记

    列表 列表是Python中最具灵活性的有序集合对象类型.与字符串不同的是,列表可以包含任何类型的对象:数字.字符串甚至其他列表.列表是可变对象,它支持原地修改的操作. Python的列表是: 任意对象 ...

  2. python可以使用二维元组吗_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...

    怎么去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...

  3. python只能对列表进行切片_Python中的列表

    1. 列表的创建 列表(list)是Python中一个非常重要的类型,用于管理一组数据,列表的形式如下所示 country = ['China', 'Germany', 'Russia', 'Amer ...

  4. python numpy数组切片_python中numpy数组切片实验解释

    print(a[0::2]).a[::2].[:,2].[1:,-1:].a[::-1].[ : n].[m : ].[-1].[:-1].[1:]等的含义 文章目录 一维数组(冒号:) 1.一个参数 ...

  5. python 字典排序 最大键_Python中的列表、元祖、字典、集合操作大全

    来源:http://suo.im/5HPGNT 在Python中有4种内建的数据结构:列表.元组.字典.集合.今天我们将会学习如何使用它们,以及它们如何使编程变得简单. 一.列表list 是处理一组有 ...

  6. python中字典列表元组_Python中的列表和元组

    python中字典列表元组 Lists and tuples are arguably Python's most versatile, useful data types. You will fin ...

  7. python支付程序源码_Python提取支付宝和微信支付二维码的示例代码

    支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件 ...

  8. python中的列表生成式_Python中的列表生成式

    列表生成式 抛出一个问题,创建一个从1到100的列表,该怎么写: while li = [] i = 1 while i <= 100: li.append(i) i += 1 print(li ...

  9. python中列表常用方法_Python中列表的常用方法

    给列表添加元素 append方法 在列表最后追加元素 l1 = ['a', 'b', 'c', 'd', ] l1.append('e')print(l1)print(l1.append('e'))# ...

最新文章

  1. linux中错误日志等级
  2. k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)
  3. docker api 基本介绍和使用
  4. 限制用户对页的访问php,如何限制对Django中管理页的访问?
  5. 基础算法 —— 贪心算法
  6. 程序员的10条黄金法则,你懂?
  7. linux shell删除归档_linux打怪技能方向规划,送给迷茫学习的你
  8. java中datetime类型转换,Java中日期格式和其他类型转换详解
  9. 如何在excel不同的工作表之间使用数据有效性?
  10. android组建之间通信_Android组件化(三)组件之间的通信
  11. 单频和混频是什么意思_科研| 谐波混频器常见电路小结
  12. python自学-Python 应该怎么学?
  13. 计算机图形学开发框架,计算机图形学-基于3d图形开发技术
  14. win10下Miracast无线投屏使用教程及异常解决方案(超详细)
  15. 域名卡密自助授权系统
  16. 【产品分析】Luckin coffee
  17. 不想做外包,当不了药神,AI公司如何才能走通制药这条路?
  18. 5.绘制统计图形——堆积图
  19. 关键成功因素法(CrISical Success Factors,CSF)
  20. c++合理利用adl来重载概念

热门文章

  1. 实时查看磁盘inode和block变化
  2. 多任务的同步与相互排斥
  3. mask层--- ios开发view圆角属性的layer层的实质
  4. spring相关资源
  5. 协程入门(一):启动与挂起
  6. Component template should contain exactly one root element---基于Vue的uniapp手机端_前端UI_uview工作笔记002
  7. ES6新特性_ES6语法糖_ES5中构造函数的继承---JavaScript_ECMAScript_ES6-ES11新特性工作笔记035
  8. 基于Spring Security的认证方式_实现认证功能_Spring Security OAuth2.0认证授权---springcloud工作笔记120
  9. JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池
  10. springCloud工作笔记090---SpringCloud_redis配置多数据源_redis多数据源