清风白茶

我们都会上岸,阳光万里,去哪里都是鲜花开放。
踩坑-python创建二维数组

踩坑-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
2
3
print("a = ", a)		# a原来的值
a[2][2] = 2
print('a = ', a) # 修改后a的值

输出结果如下:

1
2
a = [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]	# 修改a的值
a = [[1, 1, 2, 1], [1, 1, 2, 1], [1, 1, 2, 1], [1, 1, 2, 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
2
import numpy as np	# 需要安装numpy
a = np.ones(16).reshape(4,4)

解释

list * n 相当于是 n个list的浅拷贝的连接。下面代码打印了a中每个子列表的id值。

1
2
for i in range(4):
print(id(a[i]))

结果如下:

1
2
3
4
4460725424
4460725424
4460725424
4460725424

可以看到a中每个子列表的id值都是相同的,即它们引用的是同一个列表。当对其中的某个子列表进行修改时,其它子列表自然也改变了。


评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×