Python數組和數字相乘時注意事項

注意事項

    [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]


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章