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 ] ...
随机推荐
- 第2天 第一个程序&IDEA安装&Java基础语法
第一个程序 Hello,World! 随便新建一个文件夹,存放代码 新建一个Java文件 文件后缀名为java Hello.java [注意点]系统可能没有显示后缀名,必须手动打开 编写代码 publ ...
- [考试总结]noip模拟15
这次不咕了. 首先发现这套题目十分毒瘤, \(T1\) 就没有太大的思路. 结果最后也是暴力收场... 菜. \(T1\;60pts\) 暴力居然还是挺高的,\(T2\) 莽了一个随机化上去结果还是暴 ...
- Apache Flink上传路径遍历(CVE-2020-17518)
影响版本 Flink1.5.1-1.11.2 复现 POST /jars/upload HTTP/1.1 Host: localhost:8081 Accept-Encoding: gzip, def ...
- 自建简易FaaS平台
近些年来,传统的 IaaS.PaaS 已经无法满足人们对资源调度的需求了.各大云厂商相继开始推出自家的 Serverless 服务.Serverless 顾名思义,它是"无服务器" ...
- 自学linux——15.云主机的购买流程及域名的购买备案解析
项目上线流程 一.服务器选配购买 项目上线的服务器必须是外网服务器 1.服务器购买情况 真实服务器(成本过高,购买内部自用) 云服务器(上线首选):阿里云,腾讯云,华为云 2.购买阿里云服务器:htt ...
- Android中的一些小细节
在代码中获取到的padding .margin.getWidth.event.getX.context.getResources().getDimensionPixelSize(R.dimen.key ...
- 剑指 Offer 30. 包含min函数的栈
剑指 Offer 30. 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例 ...
- 一个故事看懂HTTPS
我是一个浏览器,每到夜深人静的时候,主人就打开我开始学习. 为了不让别人看到浏览记录,主人选择了"无痕模式". 但网络中总是有很多坏人,他们通过抓包截获我和服务器的通信,主人干了什 ...
- csaw2013reversing2 writeup
csaw2013reversing2 writeup 1.程序分析 题目是一个exe文件,提示运行即可拿到flag,但是窗口弹出之后会出现一堆乱码.这时候,我们把文件丢入IDA之中,看到程序大致流程如 ...
- 为数不多的人知道的 Kotlin 技巧及解析
文章中没有奇淫技巧,都是一些在实际开发中常用,但很容易被我们忽略的一些常见问题,源于平时的总结,这篇文章主要对这些常见问题进行分析. 这篇文章主要分析一些常见问题的解决方案,如果使用不当会对 性能 和 ...