我在拼图中涉及的一段代码中发现了这个声明,有人能解释它在做什么吗?我试过看自己,但我真的不明白。
test = [[0] * 9] * 9
答案 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个列表的列表。