踩坑-python创建二维数组
在做一道动态规划的题需要用到一个二维数组。看到二维数组很快就能想到可以用嵌套的list来实现,但是这里面是有个坑的。
例如创建一个4X4的二维数组,全部值置为1.
错误的代码:
1 | a = [[1]*4]*4 # 类似于 ‘+’*100 |
输出结果如下,看起来一点问题都没有!
1 | a = [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]] |
接着对a中某个单独的值进行修改。
1 | print("a = ", a) # a原来的值 |
输出结果如下:
1 | a = [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]] # 修改a的值 |
对比一下,a[2][2] = 2
这个操作它修改了a[2]
而不是a[2][2]
.?????惊喜!!!
正确的方法
- 列表生成式
1 | a = [[1 for i in range(4)] for j in range(4)] |
列表生成式真的太有用了!!!
- 使用numpy模块创建
1 | import numpy as np # 需要安装numpy |
解释
list * n 相当于是 n个list的浅拷贝的连接。下面代码打印了a中每个子列表的id值。
1 | for i in range(4): |
结果如下:
1 | 4460725424 |
可以看到a中每个子列表的id值都是相同的,即它们引用的是同一个列表。当对其中的某个子列表进行修改时,其它子列表自然也改变了。
踩坑-python创建二维数组