這是因爲[[0]*n]*n
創建充滿引用同一列表([0]*n
)大小n
的列表,所以當你訪問T[i][j]
,您使用的是相同的內存位置。
這裏有不同的設置的一些例子:這是創建列表和在同一數據填補他們一個非常強大的方式
>>> T=[[0]*5]*5
>>> T
[[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]]
>>> T[0][0]=5
>>> T #goes nuts
[[5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0]]
>>> T=[[0 for _ in range(5)]]*5
>>> T
[[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]]
>>> T[0][0]=5
>>> T #goes wrong
[[5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0], [5, 0, 0, 0, 0]]
>>> T=[[0 for _ in range(5)] for _ in range(5)]
>>> T
[[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]]
>>> T[0][0]=5
>>> T #this is correct!
[[5, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> T=[[0]*5 for _ in range(5)]
>>> T
[[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]]
>>> T[0][0]=5
>>> T #this is also correct!
[[5, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
在除了第一個例子中,我使用list comprehensions,時間。
我想這是
及注意事項,有什麼用可變對象發生值得再次提到整潔的(python-3)'T = list(zip(* p))' – Aguy
@Aguy它也適用於Python 2。 –