2013-03-27 118 views
4
>>> CM = [[0 for _ in range(10)]] * 10 
>>> CM  
[[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, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 
>>> CM[0][0] = CM[0][0] + 1 
>>> CM 
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 

我試圖創建一個混淆矩陣。它基本上包含(i,j)對的數量。 我首先創建了一個列表清單,然後遞增了相應的變量。但是,它沒有按預期工作。對於i的所有值,CM [i] [0]都增加了。範圍(10)中的[[範圍(10)]範圍內的[[0]]和範圍[10範圍內的範圍10中的[0]之間的區別是什麼?

我找到了解決辦法。

>>> CM = [[0 for _ in range(10)] for _ in range(10)] 
>>> CM 
[[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, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 
>>> CM[0][0] = CM[0][0] + 1 
>>> CM 
[[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, 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

謝謝!我試過搜索,但也許沒有使用正確的查詢。 – user1944668 2013-03-27 08:54:30

+0

注意''範圍(10)中的CM = [[0] * 10]''也可以在這裏工作 – Eric 2013-03-27 09:02:55

+0

啊!謝謝。我會牢記這一點。 – user1944668 2013-03-27 09:19:06

回答

3
>>> CM = [[0 for _ in range(10)]] * 10 

正在複製對同一對象的引用十次。它相當於此:

>>> x = [0 for _ in range(10)] 
>>> CM = [x, x, x, x, x, x, x, x, x, x] 

所以操縱一個元件會產生副作用。您的解決方法是優雅和正確的。

>>> CM = [[0 for _ in range(10)]] * 10 

正在複製對同一對象的引用十次。它相當於此:

>>> x = [[0 for _ in range(10)]] 
>>> CM = [x, x, x, x, x, x, x, x, x, x] 

所以操縱一個元件會產生副作用。您的解決方法是優雅和正確的。

注:

,會出現此由於列出的元素是列表(其是可變的)。如果它們是例如不可變的字符串,那麼如果在不同的列表中引用了相同的字符串,則不會有問題,因爲它們不能被操縱。 Python不喜歡浪費內存(除非明確告知即deepcopy),因此複製列表將簡單地複製它們的引用。

+0

謝謝!這是我在Stack Overflow上的第一個問題,立即得到解答!非常感謝! – user1944668 2013-03-27 08:57:31