gpt4 book ai didi

python - 代码未附加正确的对象...为什么?

转载 作者:行者123 更新时间:2023-12-01 05:17:15 25 4
gpt4 key购买 nike

我试图让我的代码获取一个坐标,将棋盘上的该位置转换为玩家 token (即1),然后将因此被两个玩家 token 包围的任何其他 token 也转换为玩家 token 。

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

但是:我拿回了两 block 相同的板。我们将不胜感激。

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

最佳答案

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

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

在对可变对象进行列表初始化时要记住这一点,包括 numpy.array的,list的,dict[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)

然后通过 boardlist0[ind,k[0],k[1]] 对其进行索引

关于python - 代码未附加正确的对象...为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22964718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com