2013-07-31 125 views
5

我對Python相當陌生,所以我對語法和事情的工作方式並不十分熟悉。這是可能我誤解,但我可以從我的代碼跟這行:在Python中引用相同對象的對象列表列表

largeBoard = [[Board() for i in range(3)] for j in range(3)] 

創造9個引用到同一個董事會的對象,而不是9個不同的董事會對象。我如何創建9個不同的Board對象?

當我運行:

largeBoard = [[Board() for i in range(3)] for j in range(3)]   
x_or_o = 'x'  
largeBoard[1][0].board[0][0] = 'g' # each Board has a board inside that is a list 
for i in range(3): 
    for j in range(3): 
     for k in range(3): 
      for l in range(3): 
       print largeBoard[i][j].board[k][l] 

我得到多個「G」是什麼讓我覺得他們是同一個對象的所有引用。

+6

它確實創建了9個不同的Board對象。嘗試在'largeBoard'中打印每個對象的'id'。 –

+1

是什麼讓你覺得它不會創建不同的對象? –

+1

它們都是不同的對象。 – zsong

回答

4

你有反過來:你在那裏創建9個獨立的Board實例。如果你有這樣的事情

largeBoard = [[Board()] * 3] * 3 

然後你只會有一個實例。這是許多Python新手所犯的常見錯誤的根源。

[X for i in range(3)]每個i(這裏的3倍)的計算結果X一次而[X] * 3評估X只有一次。

1

我猜這是你的主板級(我是能夠重現使用這個你的錯誤):

class Board: 
    board = [[0 for x in range(3)] for x in range(3)] 

要解決這個問題,你需要創建一個__init__()函數來初始化你的董事會,使每個實例有自己的板:

class Board: 
    def __init__(self): 
     self.board = [[0 for x in range(3)] for x in range(3)] 

然後你應該只看到一個「g」。 Here is the code in ideone that compares the classes.