2013-07-31 119 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.