代码没有附加正确的对象...为什么?

时间:2014-04-09 13:51:08

标签: python python-2.7 python-3.x

我正在尝试让我的代码获取坐标,将棋盘上的位置转换为玩家令牌(即1),然后将由两个玩家代币封闭的任何其他令牌也转换为玩家令牌。

然后我希望它将电路板附加到列表(boardlist1)。 然后应该对第二个坐标重复此过程,在我的boardlist1中,我应该返回2个不同的板。

但是:我找回了2个相同的电路板。帮助会很高兴。

import numpy

board = numpy.array([[0, 0, 0, 0, 0, 0, 0, 0],
                     [0, 0, 0, 0, 0, 0, 0, 0],
                     [0, 0, 0, 0, 0, 0, 0, 0],
                     [0, 0, 0, 1, 2, 0, 0, 0],
                     [0, 0, 0, 2, 1, 0, 0, 0],
                     [0, 0, 0, 0, 0, 0, 0, 0],
                     [0, 0, 0, 0, 0, 0, 0, 0],
                     [0, 0, 0, 0, 0, 0, 0, 0]])



boardlist0 = [board]*len([[5,3], [3,5]])

boardlist1 = []
ind = 0



for k in [[5,3], [3,5]]:

    boardlist0[ind][k[0]][k[1]] = 1

    direction = [[0,1], [1,0], [1,1], [0,-1], [-1,0], [-1,-1], [1,-1], [-1,1]]
    coord = []


    for j in direction:
        O1 = k[0]
        O2 = k[1]
        k[1] = k[1] + j[1]
        k[0] = k[0] + j[0]
        if k[0] > 7 or k[0] < 0 or k[1] > 7 or k[1] < 0:
                k[1] = k[1] - j[1]
                k[0] = k[0] - j[0]
        while boardlist0[ind][k[0]][k[1]] == 2:
            coord.append(k)                   
            k[1] = k[1] + j[1]
            k[0] = k[0] + j[0]
            if k[0] > 7 or k[0] < 0 or k[1] > 7 or k[1] < 0:
                k[1] = k[1] - j[1]
                k[0] = k[0] - j[0]
                coord = []
                break
            if boardlist0[ind][k[0]][k[1]] == 0:
                coord = []
                break
            elif boardlist0[ind][k[0]][k[1]] == 1:
                for i in coord:
                    boardlist0[ind][i[0] - j[0]][i[1] - j[1]] = 1
                boardlist1.append(boardlist0[ind])                    

        k[0] = O1
        k[1] = O2
    ind += 1



print boardlist1

1 个答案:

答案 0 :(得分:2)

boardlist0 = [board] * len([[5,3],[3,5]])

返回包含对相同 array对象的两个引用的列表,因此通过boardlist[0]修改数组元素也会更改boardlist[1](反之亦然)。

在对可变对象进行列表初始化时要记住这一点很重要,包括numpy.arraylistdict等。{{1} } [obj]*N给同一个对象的N个引用列表;对于不可变的东西(数字,字符串,元组),这几乎总能做你想要的。

解决此问题的方法是显式复制数组,例如:

N

如果您更喜欢将其写为[board.copy() for i in xrange( len( [[5,3],[3,5]] )) ] ,还有一个numpy.copy副本。

如果您不熟悉“电路板列表”设计,可以将整个结构整合为一个numpy.copy(board)数组:

numpy

然后通过boardlist0=numpy.repeat( board[numpy.newaxis,:,:], len([[5,3],[3,5]]), axis=0)

对其进行索引