python嵌套列表知多少
今天在创建嵌套列表时遇到一个问题,决定看看到底是谁在背后捣鬼
>>> board1 = [[0]*3 for _ in range(3)]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> board2 = [[0]*3]*3
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
没错,看起来两种方法都可以创建嵌套列表,但是赋值的时候缺出现了问题
>>> board1[1][1] = 1
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
>>> board2[1][1] = 1
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
查阅资料,发现这是 board2 列表内的 3 个引用指向同一个对象的原因。作为一只菜鸟,仍然不解其意,又看到了下面的例子
>>> board3 = []
>>> for i in range(3):
... row=[0] * 3
... board3.append(row)
...
>>> board3
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> board3[1][1] = 1
>>> board3
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
board3 和 board1 是一样的,每次迭代新建了一个列表,意味着列表的每行指向不同的地址。
再看下面的例子
>>> board4 = []
>>> row=[0] * 3
>>> for i in range(3):
... board4.append(row)
>>> board4
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> board4[1][1] = 1
>>> board4
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
board4 和 board2 是一样的,每次迭代都添加同一个对象到列表,意味着列表的每行指向了同一块地址。
为什么会这样?
这是引用和可变对象背后的原理和陷阱。
python 中默认是做浅复制,假如list1 是一个列表,list(list1) 或 list1[:] 都会创建 list1 的副本,它们做的是浅复制(只复制了最外层容器,副本中元素依然是源容器中元素的引用)。浅复制共享同一个列表对象
为了清楚的理解它们到底是如何运行的,我们将下面创建嵌套列表的过程进行可视化
board1 = [[0]*3 for _ in range(3)]
board1[1][1] = 1
board2 = [[0]*3]*3
board2[1][1] = 1
第一行:
首先创建一个可迭代对象,在循环体中创建[0]*3 赋值到新列表对应位置

可以看到,嵌套列表内每个子列表占用单独的空间,所以赋值操作 board1[1][1] = 1 只会改变其中一个

第三行:
嵌套列表内的三个子列表指向同一个对象,所以赋值操作会造成我们最初看到的情形。

大家可以在这里试着输入自己的代码,看看可视化执行过程。欢迎留言
python嵌套列表知多少的更多相关文章
- Python嵌套列表去重
raw_list = [ [ 'CS_SUPP_INFO', 'A', '1'], [ 'CS_SUPP_INFO', '1', 'A'], [ 'CS_SUPP_INFO', '1', 'A'], ...
- python嵌套列表
从excel读取一行信息添加到一个临时列表,最后将所有行的列表添加到一个大列表. 源码: import xlrd,reclass Info(): def read_info(self): data = ...
- Python 嵌套列表解析
将一个3*4矩阵转为4*3矩阵Matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12],]afterMatrix = [[row[i] for ro ...
- python 嵌套列表
- PYTHON压平嵌套列表
list 是 Python 中使用最频繁的数据类型, 标准库里面有丰富的函数可以使用.不过,如果把多维列表转换成一维列表(不知道这种需求多不多),还真不容易找到好用的函数,要知道Ruby.Mathem ...
- python:字典嵌套列表
Python的字典{ }以键值对的形式保存数据,可以以键来访问字典中保存的值而不能用下标访问.字典中几乎可以包含任意的变量,字典,数列,元组.数列也一样. python的列表[ ]与字典不同,列表通过 ...
- python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解
推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...
- Python 字典 列表 嵌套 复杂排序大全
https://blog.csdn.net/ray_up/article/details/42084863 一: 字典排序 解析: 使用sorted 方法, 排序后的结果为一个元组. 可以字符串排序( ...
- 孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法
孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) (同步的语音笔记朗读:https://www.ximalaya.com/keji/1 ...
随机推荐
- springMVC容器简介和执行流程
先来看一下,初始化的大体流程: 然后,我们再来看一下,我们的控制器DispatcherServlet的类图及继承关系. 系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到 ...
- MySQL优化之避免索引失效的方法
在上一篇文章中,通过分析执行计划的字段说明,大体说了一下索引优化过程中的一些注意点,那么如何才能避免索引失效呢?本篇文章将来讨论这个问题. 避免索引失效的常见方法 1.对于复合索引的使用,应按照索引建 ...
- Building Applications with Force.com and VisualForce(六):Designing Applications for Multiple users: Accommodating Multiple Users in your App
Dev 401-006 Designing Applications for Multiple users: Accommodating Multiple Users in your App. Cou ...
- Numpy和OpenCV中的图像几何变换
介绍 上面的图像使它不言而喻什么是几何变换.它是一种应用广泛的图像处理技术.例如,在计算机图形学中有一个简单的用例,用于在较小或较大的屏幕上显示图形内容时简单地重新缩放图形内容. 它也可以应用于扭曲一 ...
- Redis在linux环境下的安装
下载Redis安装包 wget http://download.redis.io/releases/redis-3.2.9.tar.gz 解压Redis安装包 tar -zxvf redis-3.2. ...
- [算法]移除指定元素&strSr()的实现
移除指定元素 题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原 ...
- Ubuntu环境下如何设置文件(文件夹)权限
查看文件(文件夹)权限 cd到需要查看的文件(文件夹)所在目录并执行: (base) duanyongchun@hc1217:~$ ls -l #查看当前文件夹下的所有文件(包括文件夹)的权限 如图: ...
- [noip模拟]画展<队列的基础知识>
Description 博览馆正在展出由世上最佳的M位画家所画的图画.人们想到博览馆去看这几位大师的作品.可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字,a和b,代表要看展览中 ...
- 金三银四科学找工作,用python大数据分析一线城市1000多份岗位招聘需求
文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 每年的三四月份是招聘高峰,也常被大家称为金三银四黄金招聘期,这时候上一 ...
- 《SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS》论文阅读
背景简介 GCN的提出是为了处理非结构化数据(相对于image像素点而言).CNN处理规则矩形的网格像素点已经十分成熟,其最大的特点就是利用卷积进行①参数共享②局部连接,如下图: 那么类比到非结构数据 ...