如何优雅的创建并访问python二维列表(甚至多维)

  相信有小伙伴遇到过使用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共享的同一块内存空间,让我们输出看看:
​​
​​​​​​​​如何优雅的创建并访问python二维列表(甚至多维)_第1张图片不出  所料,正是共享内存的。于是我们需要换种方式来生成,像下面的语句:

b = [['x'] * 4 for _ in range(5)]

如何优雅的创建并访问python二维列表(甚至多维)_第2张图片
  这样就能任意修改了。
  访问的时候,通常我们这样做:

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
'''

  对于多维数组也是这个道理。

​​​

你可能感兴趣的:(学习笔记,python,开发语言)