【问题标题】:What is the difference between [[0 for _ in range(10)] for _ in range(10)] and [0 for _ in range(10)] * 10? [duplicate][[0 for _ in range(10)] for _ in range(10)] 和 [0 for _ in range(10)] * 10 有什么区别? [复制]
【发布时间】:2013-03-27 08:48:55
【问题描述】:
>>> 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) 对的计数。 我首先创建了一个列表列表,然后增加了相应的变量。但是,它并没有按预期工作。 CM[i][0] 对于 i 的所有值都会递增。

我找到了解决办法。

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

但如果有人能解释第一种方法失败的原因,我将不胜感激。

【问题讨论】:

  • 谢谢!我尝试搜索,但可能没有使用正确的查询。
  • 请注意,CM = [[0]*10 for _ in range(10)] 也可以在这里使用
  • 啊!谢谢。我会记住这一点。

标签: python list


【解决方案1】:
>>> 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 不喜欢浪费内存(除非明确告知 ie.deepcopy),所以复制列表只会复制它们的引用。

【讨论】:

  • 谢谢!这是我在 Stack Overflow 上的第一个问题,并立即得到了回答!非常感谢!
猜你喜欢
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2012-04-29
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多