在Python中引用相同对象的Object列表

时间:2013-07-31 14:47:14

标签: python

我是Python的新手,因此我对语法和工作方式并不十分熟悉。我可能会误解,但从我的代码中可以看出这一行:

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

创建了对同一Board对象的9个引用,而不是9个不同的Board对象。如何创建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',这让我觉得它们都是对同一个对象的引用。

2 个答案:

答案 0 :(得分:4)

你反过来了:你 在那里创建了9个独立的Board个实例。如果你有像

这样的东西
largeBoard = [[Board()] * 3] * 3

然后你只有一个实例。这是许多Python新手所犯的常见错误的根源。

[X for i in range(3)]为每个X评估i一次(此处为3次),而[X] * 3仅评估X一次。

答案 1 :(得分:1)

我猜这是你的Board类(我能用这个重现你的错误):

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.