当我们使用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]]
---------------------作者:zzc15806 来源:CSDN 原文:https://blog.csdn.net/zzc15806/a ... 406?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!
|
|