array1 = [[0]*4]*4
array2 = [[0,0,0,0]]*4
array3 = [[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0]]
array1[0][0] = 9000
array2[0][0] = 9000
array3[0][0] = 9000
In [77]: array1
Out[77]: [[9000, 0, 0, 0],
[9000, 0, 0, 0],
[9000, 0, 0, 0],
[9000, 0, 0, 0]]
In [78]: array2
Out[78]: [[9000, 0, 0, 0],
[9000, 0, 0, 0],
[9000, 0, 0, 0],
[9000, 0, 0, 0]]
In [79]: array3
Out[79]: [[9000, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
对任何行值进行变换会改变初始化快捷方法的所有行值。
我可以获得非变异行为的唯一方法是写出整个列表。
必须有更好的方法(?),想想你想根据不同列表的长度初始化列表的情况。
答案 0 :(得分:2)
使用列表理解。
my_list = [ [0]*4 for _ in range(4)]
请注意,列表是可变的,但整数不是。因此[0] * 4的行为与您预期的一样,但[[0] * 4] * 4'泄漏'变化。
使用列表推导每次都会创建一个新的外部列表,避免示例的问题行为。