这种数组是什么意思/做什么的?

时间:2014-03-02 19:46:23

标签: python arrays python-2.7

我在拼图中涉及的一段代码中发现了这个声明,有人能解释它在做什么吗?我试过看自己,但我真的不明白。

test = [[0] * 9] * 9

3 个答案:

答案 0 :(得分:10)

当你这样做时

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

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

答案 1 :(得分: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)]

因为Python中的integers are immutables,你可以像

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

答案 2 :(得分:0)

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