python中二维数组怎么定义和输入呢_技术图文:如何在Python中定义二维数组?

本文介绍了在Python中如何定义和使用二维数组,通过示例解释了使用list创建二维数组时可能出现的问题,并推荐使用numpy的ndarray结构。文章还解答了关于Python二维数组修改后为何其他元素受影响的疑惑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

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

“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]] 

for i in x:

print(i, type(i))

# [1, 2, 3] 

# [4, 5, 6] 

# [7, 8, 9] 

# [0, 0, 0] 

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]] 

x[0][0] = 1

print(x, type(x))

# [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] 

x = [[0] * 3 for row in range(4)]

print(x, type(x))

# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] 

x[1][1] = 1

print(x, type(x))

# [[0, 0, 0], [0, 1, 0], [0, 0, 0], [0, 0, 0]] 

跟我们预期的结果是一致的,我们再来看上面同学的问题:x = [[0] * 3] * 4

print(x, type(x))

# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] 

x[0][0] = 1

print(x, type(x))

# [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] 

下面代码与上面代码等价:a = [0] * 3

x = [a] * 4

print(x, type(x))

# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] 

x[0][0] = 1

print(x, type(x))

# [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] 

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

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

总结

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

x = np.zeros([3, 4])

x[0, 0] = 1

print(x, type(x))

# [[1. 0. 0. 0.]

#  [0. 0. 0. 0.]

#  [0. 0. 0. 0.]] 

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

当前活动

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值