【发布时间】:2014-04-03 15:49:54
【问题描述】:
我在一段涉及谜题的代码中发现了这个声明,谁能解释它在做什么?我试过看自己,但我不太明白。
test = [[0] * 9] * 9
【问题讨论】:
-
@zhangxaochen 你确定吗?那家伙知道
*在做什么,虽然不完全,并且被参考文献所吸引。这里的 OP 可能需要更深入和从头开始的解释。
标签: python arrays python-2.7
我在一段涉及谜题的代码中发现了这个声明,谁能解释它在做什么?我试过看自己,但我不太明白。
test = [[0] * 9] * 9
【问题讨论】:
* 在做什么,虽然不完全,并且被参考文献所吸引。这里的 OP 可能需要更深入和从头开始的解释。
标签: python arrays python-2.7
当你这样做时
[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 中 [...] 的更好名称。阅读有关列表和元组的更多信息。
【讨论】:
注意:这是错误的。不要将其用作样板代码。
当你这样做时
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)]
【讨论】:
语法[0] * 9 将生成一个包含 9 个零的列表。所以我相信完整的代码会生成一个由 9 个零组成的 9 个列表。
【讨论】: