2013-09-22 130 views
0

我不知道這是否是一個錯誤,或者我在陣列中的*記號的錯誤語義:初始化矩陣python3

>>> arr = [None] * 5 # Initialize array of 5 'None' items 
>>> arr 
[None, None, None, None, None] 
>>> arr[2] = "banana" 
>>> arr 
[None, None, 'banana', None, None] 
>>> # right? 
... 
>>> mx = [ [None] * 3 ] * 2  # initialize a 3x2 matrix with 'None' items 
>>> mx 
[[None, None, None], [None, None, None]] 
>>> # so far, so good, but then: 
... 
>>> mx[0][0] = "banana" 
>>> mx 
[['banana', None, None], ['banana', None, None]] 
>>> # Huh? 

這是一個錯誤,還是我找錯了語義__mult__令牌的含義?

回答

1

您正在多次將相同的參考複製到列表中。像這樣做:

matrix = [[None]*3 for i in range(2)]

+0

所以,那有什麼確切的'*'令牌的含義是什麼?如果它複製了一個對象的引用,那麼我應該期望在第一部分傳遞'arr [2] =「banana」'時,該列表應該是'['banana','banana','banana ','香蕉','香蕉']'而不是上面那個。 – user2804578

+0

哦,剛碰到答案[StackOverflow其他地方](http://stackoverflow.com/questions/9658459/initializing-matrix-in-python-using-0xy-creates-linked-rows/9658522#9658522)但是,我發現奇怪的是'*'標記在列表上的含義與其他基本數據類型不同 – user2804578

+0

它確實具有相同的含義。對於不可變類型來說,像「複製」這樣的東西總是會創建一個賦予相同值的新對象,而可變對象只是複製其引用。這裏有一些更好的閱讀,它是什麼意思,類型是不可變的。 http://stackoverflow.com/questions/8056130/immutable-vs-mutable-types-python – Ben