我正在尝试让我的代码获取坐标,将棋盘上的位置转换为玩家令牌(即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
答案 0 :(得分:2)
boardlist0 = [board] * len([[5,3],[3,5]])
返回包含对相同 array
对象的两个引用的列表,因此通过boardlist[0]
修改数组元素也会更改boardlist[1]
(反之亦然)。
在对可变对象进行列表初始化时要记住这一点很重要,包括numpy.array
,list
,dict
等。{{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)