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_matrixwrong_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创建二维列表的正确姿势的更多相关文章

  1. Python创建二维数组(关于list的一个小坑)

    0.目录 1.遇到的问题 2.创建二维数组的办法 3.1 直接创建法 3.2 列表生成式法 3.3 使用模块numpy创建 1.遇到的问题 今天写Python代码的时候遇到了一个大坑,差点就耽误我交作 ...

  2. python构造二维列表以及排序字典

    1. 构造二维列表: 比如我现在需要一个100*100的二维列表: a = [] for i in range(100): a.append([]) for j in range(100): a[i] ...

  3. python保存二维列表到txt文件,读取txt文件里面的数据转化为二维列表

    源码: # 读文件里面的数据转化为二维列表 def Read_list(filename): file1 = open(filename+".txt", "r" ...

  4. python创建多维列表

    By francis_hao    Mar 24,2018   "*"操作符可以用于列表,表示将列表内容重复n次.如下,   但是当列表内容是列表的时候就出问题了,如果我只是修改多 ...

  5. python 创建二维数组

    myList = [([0] * 3) for i in range(4)] myList[0][1] = 1 myList[1].append(2) print myList /usr/bin/py ...

  6. python 创建二维数组的方法

    废话不多说,直接上代码: #coding=utf-8 def two_di_demo1(): a=[] for i in range(10): a.append([]) for j in range( ...

  7. python创建二维数组

    c=[[0]*3 for i in range(3)] c=[[0 for i in range(3)] for i in range(3)]

  8. Python 二维列表

    一维列表,可以使用 * 快速创建list1=[0]*Width r = [0]*5 print r r[1]= 1 print r [0, 0, 0, 0, 0] [0, 1, 0, 0, 0] 扩展 ...

  9. Python笔记25-----------创建二维列表【浅copy】和转置

    一.创建二维列表 1.二维列表创建第二维的时候,如果采用*2这种方式,这是一种浅复制的方式,同时引用到同一个list,如上图的C. 这种形式,不方便修改C[ i ][ j ]的数据,如果改C[ 0 ] ...

随机推荐

  1. 禁用ipv6的两种方法

    1 通过系统配置文件/etc/sysctl.conf 在sysctl.conf文件中添加行 # 禁用整个系统所有接口的IPv6 net.ipv6.conf.all.disable_ipv6 = 1 # ...

  2. python + pytest基本使用方法(拓展库)

    一.测试钩子配置文件 import pytest# conftest.py 是pytest特有的本地测试配置文件;# 既可以用来设置项目级别的Fixture,也可用来导入外部插件,还可以指定钩子函数# ...

  3. Java成长之路--一个非科班生的进阶之路

    前言 笔者从事Java开发六年有余,从什么都不懂的小白一路成长到上市公司管理20人的技术leader.管理的团队,虽然人数不算多,但也是对于我这个非科班生这么多年努力的一种肯定.在技术的道路上,我没有 ...

  4. etcd学习(3)-grpc使用etcd做服务发现

    grpc通过etcd实现服务发现 前言 服务注册 服务发现 负载均衡 集中式LB(Proxy Model) 进程内LB(Balancing-aware Client) 独立 LB 进程(Externa ...

  5. element取消全局loading

    背景 前两天在开发一个管理后台项目时, 遇到了一个问题,后端接口返回特别慢,由于该接口调用的是第三方API,无法通过后端去处理.此时想到用loading动画,但随之而来也产生了不少问题, 在此记录一下 ...

  6. 共享内存 & Actor并发模型哪个更快?

    HI,前几天被.NET圈纪检委@懒得勤快问到共享内存和Actor并发模型哪个速度更快. 前文传送门: 说实在,我内心10w头羊驼跑过...... 先说结论 首先两者对于并发的风格模型不一样. 共享内存 ...

  7. ts踩坑笔记

    1.react中 this.el 报错 Property 'el' does not exist on type,添加el: any; 2.使用window.xx编译总是报错,用下面方法解决 let ...

  8. U 跳转中加入变量参数的写法

    href="{:U('Message/news?id='.$vo['messageid'].'')}" 就是在U方法里如果参数是变量就用 '.$i.'代替 {$i} <a h ...

  9. 【问题记录】- 谷歌浏览器 Html生成PDF

    起因: 由于项目需要实现将网页静默打印效果,那么直接使用浏览器打印功能无法达到静默打印效果. 浏览器打印都会弹出预览界面(如下图),无法达到静默打印. 解决方案: 谷歌浏览器提供了将html直接打印成 ...

  10. 身边好几个技术一般的程序员都面上了,阿里P7门槛降低?

    经常在网上的论坛里看到讨论程序员的级别,尤其在跳槽类的信息里可以看到对标阿里P7,百度T6,腾讯3.1等字眼,似乎大厂的级别俨然可以成为业内的通用货币,类似于高考分数一样,哪一档就对应着什么样的待遇. ...