2013-07-31 13 views
5

Sono abbastanza nuovo in Python e quindi non ho molta familiarità con la sintassi e il modo in cui le cose funzionano esattamente. E 'possibile che sto equivoco, ma da quello che posso dire dal mio codice di questa linea:Elenco di elenchi di oggetti che fanno riferimento allo stesso oggetto in Python

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

è la creazione di 9 riferimenti allo stesso oggetto Consiglio, piuttosto che 9 diversi oggetti da tavolo. Come posso creare 9 diversi oggetti Board?

quando ho eseguito:

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] 

ottengo multipla 'g' questo è ciò che mi ha fatto pensare che sono tutti i riferimenti allo stesso oggetto.

+6

In effetti sta creando 9 diversi oggetti 'Board'. Prova a stampare l'id di ciascun oggetto in 'largeBoard'. –

+1

Cosa ti fa pensare che non crei oggetti diversi? –

+1

Sono tutti oggetti diversi. – zsong

risposta

4

Si è invertito: si sono creando 9 istanze indipendenti Board lì. Se tu avessi qualcosa come

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

allora si avrebbe solo una singola istanza. Questa è la radice di un errore comune fatto da molti principianti di Python.

[X for i in range(3)] viene valutata X volta per ogni i (3 volte qui) che valuta le [X] * 3X sola volta.

1

Sto indovinando questo è la classe Board (sono stato in grado di riprodurre il vostro errore usando questo):

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

Per risolvere questo problema, è necessario creare una funzione __init__() per inizializzare la vostra tavola in modo che ogni istanza ha la propria scheda:

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

Quindi si dovrebbe vedere solo una "g". Here is the code in ideone that compares the classes.

Problemi correlati