Python创建二维数组的正确姿势

参考:https://zhuanlan.zhihu.com/p/88197389



列表是基于 PyListObject 实现的。PyListObject 是一个变长对象,所以列表的长度是随着元素多少动态改变的。同时它还支持插入和删除等操作,所以它还是一个可变对象

错误示范

list_one = [0]
list_two = [[0] * 3] * 3
print(list_one)
print(list_two)

>>> 运行结果:

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

看起来很完美的操作,但是如果进行一些列表更新操作,问题就显露出来了。比如我对 list_two 的更换中间位置的值,即对 list_two[1][1] 进行更换值

list_two = [[0] * 3] * 3
print(list_two)

list_two[1][1] = 2
print(list_two)

不难发现,运行结果有点不对劲,列表中有三个位置的值也改变了

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 2, 0], [0, 2, 0], [0, 2, 0]]

原因是浅拷贝,我们以这种方式创建的列表,list_two 里面的三个列表的内存是指向同一块,不管我们修改哪个列表,其他两个列表也会跟着改变


如果要使用列表创建一个二维数组,可以使用生成器来辅助实现

[[0 for i in range(3)] for j in range(3)]

list_three = [[0 for i in range(3)] for j in range(3)]
print(list_three)
list_three[1][1] = 3
print(list_three)
输出
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 3, 0], [0, 0, 0]]


posted @ 2022-03-14 19:25  麦克斯的园丁  阅读(963)  评论(1编辑  收藏  举报