2013-07-31 2 views
5

저는 Python을 처음 접했으므로 문법이 정확히 작동하는 방식에 익숙하지 않습니다. 내가 오해하고있어 가능하지만, 내 코드에서이 줄을 말할 수있는 것과 :Python에서 동일한 객체를 참조하는 객체 목록 목록

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

가 같은 보드 객체에 9 참조보다는 9 개 다른 보드의 객체를 생성됩니다. 대신 9 개의 다른 보드 객체를 어떻게 만듭니 까?

나는 실행하면 :

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 개의 서로 다른 '보드'객체가 생성됩니다. 'largeBoard'에 각 객체의 id를 출력 해보십시오. –

+1

왜 다른 객체를 만들지 않는다고 생각합니까? –

+1

그들은 모두 다른 대상입니다. – zsong

답변

4

당신은 그 반대입니다 : 입니다. 여기서 9 개의 독립 Board 인스턴스를 생성합니다. 당신이

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

같은 것을 가지고 있다면 당신은 단지 하나의 인스턴스를 것. 이것은 많은 Python 초보자들이 자주 범하는 실수의 근원입니다. [X] * 3 번만 X 평가 반면

[X for i in range(3)]i (여기에서는 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.