注意事項
[object] * n 的時候並沒有複製n-1個object,而是增加了n-1個對object的引用。
例子說明
目標:生成一個10*10且所有值都是0的二維數組
方法一:
[ [0] * 10] * 10
方法二:
[ [0 for _ in range(10)] for _ in range(10)]
本以爲兩種方法得到的結果是一樣,但是在使用時發現有些不一樣。如下面的代碼所示。當僅僅更改a[2][2]的值的時候,a[k][2] (k取0到9)全部被更改成了4。其實這是因爲[object] * n 的時候並沒有複製n-1個object,而是增加了n-1個引用。
a = [ [0] * 10] * 10
b = [ [0 for _ in range(10)] for _ in range(10)]
a[2][2] = 4
b[2][2] = 4
for i in a:
print(i)
print("--------")
for i in b:
print(i)
[0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 4, 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, 0, 0]
[0, 0, 4, 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, 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, 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, 0, 0]