Python中引用同一对象的对象列表的列表

6

我对Python还不是很熟悉,对于语法和工作方式也不是很了解。可能是我理解有误,但从我的代码来看,这行代码:

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

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

6
确实创建了9个不同的Board对象。尝试在largeBoard中打印每个对象的id - Rohit Jain
1
你为什么认为它不会创建不同的对象? - Sukrit Kalra
1
它们都是不同的对象。 - zs2020
你可能需要展示给我们你的Board类的代码...也许它是基于单例模式构建的,每次调用它的构造函数时都会返回(一个引用到)同一个对象... - twalberg
2
也许您在board中意外使用了类属性,而不是在__init__方法中设置self.board - user2357112
2个回答

6
你弄反了:那里创建了9个独立的 Board 实例。如果你有如下代码:
largeBoard = [[Board()] * 3] * 3

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

[X for i in range(3)] 对于每个 i(这里是 3 次)仅一次计算X,而 [X] * 3 只计算一次X


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"。 这是ideone中用于比较类的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接