2014-03-02 109 views
3

我在一個謎題中找到了這個聲明,任何人都可以解釋它在做什麼?我試過看自己,但我不太明白。這種數組意味着什麼?

test = [[0] * 9] * 9 
+2

@zhangxaochen你確定嗎?那個人知道'*'在幹什麼,儘管不是完全的,並且被引用了。這裏的OP可能需要更深入和從頭開始的解釋。 – Guy

回答

10

當你

[0] * 9 

你得到一個list0的:

[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

但是,這是9個引用相同的列表。 –

+0

@ e-satis是的,我已經添加了澄清。 – Christian

0

語法[0] * 9將生成9個零的列表。所以我相信完整的代碼會生成9個9個零列表的列表。

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

因爲,integers are immutables在Python中,您可以在同一寫成

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