python 二维列表(数组)赋值问题
当我们使用arr = [[0]*5]*5 初始化一个二维数组时,会得到一个5*5的数组,
In [1]: arr = [[0]*5]*5 In [2]: arr Out[2]: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
然后对这个二维数组某个元素进行赋值,会发现整列都会被赋值,
In [3]: arr[0][0] = 1 In [4]: arr Out[4]: [[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]
这是因为 [[0]*5]*5 表示的是指向 [0]*5 这个列表的引用,所以当你修改某一个值时,整个列表都会被改变。
换一种初始化方式可以解决这个问题,
In [1]: arr = [[0]*5 for _ in range(5)] In [2]: arr Out[2]: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] In [3]: arr[0][0] = 1 In [4]: arr Out[4]: [[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]