python 定义多维数组 误区 解决方法参考

文章讨论了在Python中使用列表乘法创建多维数组时遇到的问题,即改变一个元素会导致所有相关元素同步变动,原因是浅拷贝。为解决此问题,文章提出了使用列表推导式来正确创建独立的多维数组,并建议使用numpy库处理高维度数组。
摘要由CSDN通过智能技术生成

一个错误的定义方法

我们知道,定义一个一维数组可以轻松使用列表的乘法搞定

a = [0] * 10

那么多维数组很自然的就直接嵌套使用以上代码搞定

b = [[0] * 10] * 10

但是使用过程中,我们可以发现一个重大问题:一旦改变二维数组中任意一个一维数组,所有一位数组都会发生相同变动。

比如:

b = [[0] * 3] * 4
b[2][2] = 4
print(b)
# 
'''
[[0, 0, 4], [0, 0, 4], [0, 0, 4], [0, 0, 4]]
'''

期望的结果是只有下标为[2][2]的元素变为4,但是实际上,输出如下:

[[0, 0, 4], [0, 0, 4], [0, 0, 4], [0, 0, 4]]

其实原因很简单,就是浅拷贝和深拷贝的问题,我们定义的方法是将一个一维数组的引用复制多份,整合成一个数组,本质上其实只定义一个一维数组,内存中也只有一个一维数组的空间。至于那个二维数组,实际上是由很多对于同一个一维数组的引用组合而成的数组。所以就会出现上述“牵一发而动全身”的情况啦。

一种正确的参考

下面给出一种正确的方法,肯定还有,欢迎评论区补充(如果会有人看的话)。

two_dems=[[0]*3 for _ in range(3)]
three_dems = [[[0 for _ in range(3)] for _ in range(3)] for _ in range(3)]

# test
two_dems[1][2] = 5
three_dems[1][1][2] = 6
print(two_dems)
print('-----------')
for  i in three_dems:
    print(i)

输出如下:

[[0, 0, 0], [0, 0, 5], [0, 0, 0]]
-----------
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 0, 6], [0, 0, 0]]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

没有问题。

ps:这种方法主要用于创建二维或者三维,更高的话,代码会很繁杂。若有需求,建议用第三方库: `numpy` 创建,具体方法这里不再赘述。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值