【问题标题】:What does this kind of array mean/do? [duplicate]这种数组是什么意思/做什么? [复制]
【发布时间】:2014-04-03 15:49:54
【问题描述】:

我在一段涉及谜题的代码中发现了这个声明,谁能解释它在做什么?我试过看自己,但我不太明白。

test = [[0] * 9] * 9

【问题讨论】:

  • @zhangxaochen 你确定吗?那家伙知道* 在做什么,虽然不完全,并且被参考文献所吸引。这里的 OP 可能需要更深入和从头开始的解释。

标签: python arrays python-2.7


【解决方案1】:

当你这样做时

[0] * 9

你会得到一个list 和九个0

[0, 0, 0, 0, 0, 0, 0, 0, 0]

当你这样做时

[[0] * 9] * 9

你得到

[[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]

换句话说,你得到[0, 0, 0, 0, 0, 0, 0, 0, 0] 9 次。但是您必须小心,因为最后一个会生成列表的浅拷贝。如果您修改该列表的一个元素,那么它将在所有列表中“修改”(实际上因为所有这些元素都是同一个列表)。如果您希望每个列表都不同,您可以制作一个深拷贝

您可以通过使用 print 语句轻松看到这一点:

test = [[0] * 9] * 9
test[0][1] = 2
print test
>>> [[0, 2, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0, 0]]

注意: List 是 Python 中 [...] 的更好名称。阅读有关列表和元组的更多信息。

【讨论】:

  • 谨慎,这是对同一列表的 9 个引用。
  • @e-satis 是的,我已经添加了说明。
【解决方案2】:

注意:这是错误的。不要将其用作样板代码。

当你这样做时

print [0] * 9

你得到

[0, 0, 0, 0, 0, 0, 0, 0, 0]

新数组中的所有九个元素都引用了原始数组中的相同元素。所以,他们都打印0。同样的方式,当你说

print [[0] * 9] * 9

它会创建一个包含 9 个零的列表(将其视为l1),然后创建另一个包含 9 个元素的列表,所有这些都引用同一个列表(l1)。因此,当您更改新创建的列表中的一个元素时,更改将反映在所有列表中。

这样做的正确方法是

print [[0 for j in xrange(9)] for i in xrange(9)]

由于integers are immutables在Python中,你可以写成一样

print [[0] * 9 for i in xrange(9)]

【讨论】:

    【解决方案3】:

    语法[0] * 9 将生成一个包含 9 个零的列表。所以我相信完整的代码会生成一个由 9 个零组成的 9 个列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      相关资源
      最近更新 更多