Python创建二维列表的正确姿势
Python创建二维列表的正确姿势
简介
Python中没有数组,使用list结构代替,并且list结构的功能更加强大:
- 支持动态扩容,无需担心元素过量
- 对list内的元素类型不做一致性约束
- 提供丰富的方法:pop、insert、sort、index等等
- ...
list也是我们最常使用的一种结构,我们也需要了解它的一些特性,学会正确使用它。
探索列表的初始化
初始化一维列表
>>> month = ["January", "February", "March"]
初始化二维列表
>>> row, col = 3, 4
>>> right_matrix = [[0] * col for _ in range(row)]
>>> wrong_matrix = [[0] * col] * row
>>> print(right_matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> print(wrong_matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
看似两种方式初始化出的二维列表是一样的,但为啥第二种是wrong_matrix呢?它会有问题呢?
如果我们尝试更新试试
>>> right_matrix[0][0] = 1
>>> print(right_matrix)
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] # 正常
>>> wrong_matrix[0][0] = 1
>>> print(wrong_matrix)
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]] # 不正常,每行第一列都被更新成了1
分析两种初始化方式的内存情况
率先想到的是list属于可变数据结,在函数传递过程中容易发生浅拷贝(在函数内部的更改不会影响函数外部该变量的值)。
>>> id(right_matrix[0]), id(right_matrix[1]), id(right_matrix[2])
(288926611776, 288926609600, 288926609472)
>>> id(wrong_matrix[0]), id(wrong_matrix[1]), id(wrong_matrix[2])
(288926610176, 288926610176, 288926610176)
使用id()函数可以获取对象的内存id,发现right_martix中每行的id是不同的,它们都是独立的list对象,而wrong_matrix中每行的id是相同的,它们是同一个lsit对象,所以会出现上面的情况:目的是改wrong_matrix[0][0],但实际上wrong_matrix[1][0]和wrong_martix[2][0]也被修改了。
使用http://pythontutor.com/visualize.html#mode=edit 网站执行上面的right_matrix和wrong_matrix代码来对比实际的内存情况,来验证一下
right_matrix:

wrong_matrix:

right_matrix中每个list对象都有独立的内存空间,而wrong_matrix中每个list对象指向同一块内存空间。
结论
list的元素如果是可变数据类型,一定要用方法一的方式初始化
>>> row, col = 3, 4
>>> right_matrix = [[0] * col for _ in range(row)]
这种方式下,right_matrix里的每个list对象都有独立的内存空间,不会出现修right_matrix[0][0],right_matrix[1][0]和right_martix[2][0]也被修改的情况。
Python创建二维列表的正确姿势的更多相关文章
- Python创建二维数组(关于list的一个小坑)
0.目录 1.遇到的问题 2.创建二维数组的办法 3.1 直接创建法 3.2 列表生成式法 3.3 使用模块numpy创建 1.遇到的问题 今天写Python代码的时候遇到了一个大坑,差点就耽误我交作 ...
- python构造二维列表以及排序字典
1. 构造二维列表: 比如我现在需要一个100*100的二维列表: a = [] for i in range(100): a.append([]) for j in range(100): a[i] ...
- python保存二维列表到txt文件,读取txt文件里面的数据转化为二维列表
源码: # 读文件里面的数据转化为二维列表 def Read_list(filename): file1 = open(filename+".txt", "r" ...
- python创建多维列表
By francis_hao Mar 24,2018 "*"操作符可以用于列表,表示将列表内容重复n次.如下, 但是当列表内容是列表的时候就出问题了,如果我只是修改多 ...
- python 创建二维数组
myList = [([0] * 3) for i in range(4)] myList[0][1] = 1 myList[1].append(2) print myList /usr/bin/py ...
- python 创建二维数组的方法
废话不多说,直接上代码: #coding=utf-8 def two_di_demo1(): a=[] for i in range(10): a.append([]) for j in range( ...
- python创建二维数组
c=[[0]*3 for i in range(3)] c=[[0 for i in range(3)] for i in range(3)]
- Python 二维列表
一维列表,可以使用 * 快速创建list1=[0]*Width r = [0]*5 print r r[1]= 1 print r [0, 0, 0, 0, 0] [0, 1, 0, 0, 0] 扩展 ...
- Python笔记25-----------创建二维列表【浅copy】和转置
一.创建二维列表 1.二维列表创建第二维的时候,如果采用*2这种方式,这是一种浅复制的方式,同时引用到同一个list,如上图的C. 这种形式,不方便修改C[ i ][ j ]的数据,如果改C[ 0 ] ...
随机推荐
- 微信小程序云开发-列表下拉刷新
一.json文件开启页面刷新 开启页面刷新.在页面的json文件里配置两处: "enablePullDownRefresh": true, //true代表开启页面下拉刷新 &qu ...
- 八大排序算法~冒泡排序【加变量flag的作用】
八大算法~冒泡排序[加变量flag的作用] 1,冒泡排序思想:从第一个数开始找,要把大数"排除在外"~为大数找后座.(从小到大排序哈) 外层循环~需要放后的大数个数: 内循环~从第 ...
- 一次搞懂JavaScript对象
索引 目录 索引 1. 对象与类 2.对象使用 2.1 语法 2.2 属性 3.对象特性 4.对象的创建 4.1 字面量 4.2 工厂函数 4.3 构造函数 4.4 class类 4.5 对象与单例模 ...
- Spring常见问题(五)
1.静态资源访问配置 绝对路径:访问静态资源. <mvc:resources location="/js/" mapping="/js/**">&l ...
- 前端基础css(三)
HTML:用于显示页面的内容 CSS:用于以什么样的形式(样式)去显示 一. 选择器 [1] 标签/元素选择器 (整个页面的所有的相同的标签都显示统一的样式) h1{ font-size: 20px; ...
- string子串匹配(用string自带函数,不涉及char数组转换)
using namespace std; #include <iostream> #include<string> //第1种,用string自带的s.subdtr()截取任意 ...
- 【阅读笔记】Java核心技术卷一 #6.Chapter8
8 泛型程序设计 8.1 为什么要使用泛型程序设计 类型参数(type parameters)(E.T.S...) 通配符类型(wildcard type)(?) 注意这两者用法用处并不同. 8.2 ...
- 添加xxx到右键菜单
1. 添加notepad++到右键菜单[1] 添加到 右键菜单 将以下内容保存为 OpenWithNotepad++.reg 文件,双击运行即可(其中可执行文件路径和菜单项名称请自行替换): 注: 下 ...
- ASP.NET中Textbox后的必填验证控件RequiredFieldValidator的使用方法。
制作效果如下: 实现方法: 1. 拖动RequiredFieldValidator控件到相应的textbox后位置,点击属性面板,输入ErroMessage相应信息,更改ForeColor为红色 设置 ...
- JIT in MegEngine
作者:王彪 | 旷视框架部异构计算组工程师 一.背景 什么是天元 旷视天元(MegEngine)是一个深度学习框架,它主要包含训练和推理两方面内容.训练侧一般使用 Python 搭建网络:而推理侧考虑 ...