相信有小伙伴遇到过使用python生成式的语法来创建二维数组,但是在后面使用这个数组过程中发现修改其中一项之后其他位置对应的也被修改了。比如下面这样:
a = [[1] * 4] * 5
print(a)
'''
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]
'''
a[1][1] = 10
print(a)
'''
[[1, 10, 1, 1],
[1, 10, 1, 1],
[1, 10, 1, 1],
[1, 10, 1, 1],
[1, 10, 1, 1]]
'''
这是为什么呢?我觉得是因为python在利用这种方法对数组进行复制的时候,进行的是浅拷贝,也就是这5行1共享的同一块内存空间,让我们输出看看:
不出 所料,正是共享内存的。于是我们需要换种方式来生成,像下面的语句:
b = [['x'] * 4 for _ in range(5)]
b = [[1] * 4 for _ in range(5)]
total = 0
for i in range(len(b)):
for j in range(len(b[i])):
total += b[i][j]
print(total)
'''
20
'''
我们可以更快的访问二维数组,比如我们有一个5×8的数组,我们需要统计其中大于2的元素的和,可以像下面这样来写:
# 创建5 * 8的二维数组,
b = [[1, 2, 3, 4] * 2 for _ in range(5)]
total = sum([x for row in b for x in row if x > 2])
print(total)
'''
70
'''
对于多维数组也是这个道理。