我在涉及拼图的一段代码中找到了这个声明,有人能解释一下它是在做什么吗?我已经试着自己找过了,但我真的不理解。
test = [[0] * 9] * 9
我在涉及拼图的一段代码中找到了这个声明,有人能解释一下它是在做什么吗?我已经试着自己找过了,但我真的不理解。
test = [[0] * 9] * 9
当你这样做时
[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]
。然而你必须小心,因为此操作将浅复制该列表。如果你修改了该列表的一个元素,那么所有列表都会被“修改”(实际上是因为所有这些元素都是同一个列表)。如果你想让每个列表都是不同的,则可以进行深度复制。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是[...]
的更好名称。请阅读有关列表和元组的更多信息。
注意:这是错误的。不要将其作为样板代码使用。
当你执行以下操作时
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] * 9
将生成一个包含9个零的列表。因此我相信完整代码将生成一个由9个列表组成的列表,每个列表都包含9个零。
*
在做什么,虽然不是完全理解,并且被引用所困扰。这里的 OP 可能需要更深入和从头开始的解释。 - Guy