背景

前几天,有位同学问我如下的问题:

temp[0][0]修改后,为什么temp[1][0]temp[2][0]也发生了变化?”

“在Python中二维数组是怎样定义和使用的?”

今天就来谈谈这个问题。


技术分析

在 C# 语言中有直接定义二维数组的语法,比如int[,] a = new int[3][4];或者int[][] a = new int[3][]

而 Python 语言中如果想使用二维数组,那么必须通过list这种结构来实现。

即list中的每个元素是一个list的结构。类似于 C# 中的int[][]

我们以创建一个 4×3 的二维数组进行说明:

x = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]]
print(x, type(x))
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]] <class 'list'>for i in x:print(i, type(i))
# [1, 2, 3] <class 'list'>
# [4, 5, 6] <class 'list'>
# [7, 8, 9] <class 'list'>
# [0, 0, 0] <class 'list'>x = [[0 for col in range(3)] for row in range(4)]
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>x[0][0] = 1
print(x, type(x))
# [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>x = [[0] * 3 for row in range(4)]
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>x[1][1] = 1
print(x, type(x))
# [[0, 0, 0], [0, 1, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>

跟我们预期的结果是一致的,我们再来看上面同学的问题:

x = [[0] * 3] * 4
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>x[0][0] = 1
print(x, type(x))
# [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'>

下面代码与上面代码等价:

a = [0] * 3
x = [a] * 4
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>x[0][0] = 1
print(x, type(x))
# [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'>

问题复现了,由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。即使保存一个简单的[1,2,3],也要有3个指针和3个整数对象。

x = [a] * 4操作中,只是创建4个指向list的指针而已,所以一旦a改变,x中4个a也会随之改变。所以出现了以上的问题。


总结

使用list创建二维数组会存在以上的混淆,所以在涉及到二维数组的时候,推荐大家使用numpy中的ndarray结构呀。这种结构跟 Matlab 中的数组结构几乎完全一样。

import numpy as npx = np.zeros([3, 4])
x[0, 0] = 1
print(x, type(x))
# [[1. 0. 0. 0.]
#  [0. 0. 0. 0.]
#  [0. 0. 0. 0.]] <class 'numpy.ndarray'>

好了,今天就到这里吧!希望大家阅读完之后能够有所收获。See You!


当前活动


我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

技术图文:如何在Python中定义二维数组?相关推荐

  1. 如何在Python中定义二维数组

    我想定义一个没有初始化长度的二维数组,如下所示: Matrix = [][] 但这不起作用... 我已经尝试过下面的代码,但是它也是错误的: Matrix = [5][5] 错误: Traceback ...

  2. python定义二维数组_在python中定义二维数组

    原博文 2016-08-30 19:16 − 发表于 http://liamchzh.0fees.net/?p=234&i=1 一次偶然的机会,发现python中list非常有意思. 先看一段 ...

  3. python中的二维数组_Python中的二维数组实例(list与numpy.array)

    关于python中的二维数组,主要有list和numpy.array两种. 好吧,其实还有matrices,但它必须是2维的,而numpy arrays (ndarrays) 可以是多维的. 我们主要 ...

  4. python中的二维数组与一维数组,矩阵和一维数组之间的运算

    一.python中的二维数组和一维数组之间的运算 1.当二维数组为p×p维 a=np.array([[1,2],[3,4]]) print(a.shape) a 输出: (2, 2) array([[ ...

  5. 【转】java中定义二维数组的几种写法

    原文链接 注:以下的 type[][] var 也可以这样申明 type var[][] type为数组的类型,var为变量名 写法一:行列固定的数组 //定义二维数组写法1 class Test { ...

  6. vector中定义二维数组

    如果是普通的定义二维数组 int **p; p = new int*[10]; //注意,int*[10]表示一个有10个元素的指针数组 for (int i = 0; i < 10; ++i) ...

  7. python中遍历二维数组_python遍历二维数组-女性时尚流行美容健康娱乐mv-ida网

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页  > 高级搜索 二 维 数组 5.2.1 二 ...

  8. 如何在C++中动态分配二维数组

    一般是三种方法:(1)用vector的vector,(2)先分配一个指针 数组,然后让里面每一个指针再指向一个数组,这个做法的好处是访问数组元素时比较直观,可以用a[x][y]这样的写法,缺点是它相当 ...

  9. python遍历二维数组_在Python中遍历二维数组?

    你需要告诉我们一些事情:dataset = datas.values 它可能是一个二维数组,因为它来自一个csv负载.但是什么形状和数据类型?甚至可能是阵列的一个样本. 这是函数中的data参数吗? ...

最新文章

  1. Oracle之索引和索引碎片问题解决
  2. Android开发之shape画圆环的方法
  3. LTTng 简介使用实战
  4. 使用vs2008搭建php扩展环境
  5. nginx模块nginx_upstream_check_module来检查后端服务器的健康情况
  6. Python 03-pyc、数据类型
  7. Excel乱码的解决方法
  8. java婚纱摄影网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  9. 关于FTP服务器出现227 Entering Passive Mode错误的解决思路
  10. 用计算机处理表格信息教案,表格信息的加工与表达教案
  11. 支付宝登录java_支付宝开发平台之第三方授权登录与获取用户信息
  12. 论巴西世界杯带给移动互联网产品的契机!
  13. putty 下载地址
  14. eNSP:实现不同网段不同vlan主机之间的互访(配置三层交换)
  15. js判断两个字符串相等问题
  16. 【总结】新产品开发阶段的名词 EVT/DVT/PVT/MP
  17. Elasticsearch:理解 query_string 和 simple_query_string 查询
  18. 【重磅】马晓东所著的《数字化转型方法论》获“大数据科技传播奖”,与李兰娟等10位院士、BAT高管共获殊荣
  19. 电路设计实例:op07c 运算放大电路设计--- 检测电流
  20. NSGA II实例讲解

热门文章

  1. android5.0后新特性修改标题头,Android5.0中Material Design的新特性
  2. JavaScript对象数组示例
  3. (C++)A+B 输入输出练习VI 每行的第一个数N,表示本行后面有N个数。
  4. 软件测试培训分享:软件测试初期怎么面试工作?
  5. PHP引擎php.ini 和fastcti优化
  6. Linux内核跟踪之trace框架分析【转】
  7. 做好职业规划:做自己的船长
  8. android中PreferencesActivity的使用(一)
  9. HashSet 详解
  10. java切面类整合_SpringBoot2.x【五】整合AOP切面编程