2013-03-27 138 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