这种类型的数组是什么意思/有什么作用?

3

我在涉及拼图的一段代码中找到了这个声明,有人能解释一下它是在做什么吗?我已经试着自己找过了,但我真的不理解。

test = [[0] * 9] * 9

2
@zhangxaochen 你确定吗?那个人知道 * 在做什么,虽然不是完全理解,并且被引用所困扰。这里的 OP 可能需要更深入和从头开始的解释。 - Guy
3个回答

10

当你这样做时

[0] * 9

你会得到一个包含九个 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]]
换句话说,你会得到9个[0, 0, 0, 0, 0, 0, 0, 0, 0]。然而你必须小心,因为此操作将浅复制该列表。如果你修改了该列表的一个元素,那么所有列表都会被“修改”(实际上是因为所有这些元素都是同一个列表)。如果你想让每个列表都是不同的,则可以进行深度复制
你可以通过使用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]]

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


1
请注意,这是对同一列表的9个引用。 - Bite code
@e-satis 是的,我已经添加了那个澄清。 - Christian Tapia

2

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

当你执行以下操作时

print [0] * 9

你可以获得

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

在新数组中的所有九个元素都引用原始数组中的同一个元素。因此,它们全部打印0。同样地,当您说

print [[0] * 9] * 9

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

正确的方法是:

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

在Python中,由于整数是不可变的(integers are immutables),因此您可以将其写成以下形式:

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

0

语法 [0] * 9 将生成一个包含9个零的列表。因此我相信完整代码将生成一个由9个列表组成的列表,每个列表都包含9个零。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接