我尝试编写一个具有3x3网格的游戏(想想noughts& crosses [US = Tic Tac Toe])。
每个细胞都有一个加权。当玩家放置计数器时,计算得分。我希望我的代码能够通过3x3矩阵并找到最高分并返回找到最高分的单元格的坐标(这是有效的) - 但如果有几个单元格具有相同的最高分,我想要返回一个列表,其中包含找到该分数的每个地方。
这是我的代码的简化版本(有大量的印刷语句,试图弄清楚它为什么不起作用)。
意图是循环记录一个简单的列表(" pos"),它具有行和列坐标(例如[0] [2])并将其附加到一个相等的运行列表中分数("可能")
如果不是尝试附加一个2条目列表而是放入一个随机数,而整个列表(" possibles")按预期构建,但附加2条目列表会导致重复最终位置列表(见输出)。
我显然有一个逻辑问题,但我是Python新手。谁能告诉我哪里出错了?
def test():
val = 1
max_val = 0
possibles = [] # This is the list where I will store a list of equally weighted positions
pos = [] # This is simply a 2 number co-ordinate
pos.append("") # Get it ready for row & col references
pos.append("")
for row in range (0,3):
for col in range (0,3):
print("Testing row",row,"col",col)
print("Possibles so far",possibles)
print("Pos=",pos)
pos[0] = row
pos[1] = col
print("Now pos=",pos)
#possibles.append(randint(0,100)) # This works
possibles.append(pos) # This doesn't
print("List of equals",possibles)
test()
输出:
Testing row 0 col 0
Possibles so far []
Pos= ['', '']
Now pos= [0, 0]
Testing row 0 col 1
Possibles so far [[0, 0]]
Pos= [0, 0]
Now pos= [0, 1]
Testing row 0 col 2
Possibles so far [[0, 1], [0, 1]]
Pos= [0, 1]
Now pos= [0, 2]
Testing row 1 col 0
Possibles so far [[0, 2], [0, 2], [0, 2]]
Pos= [0, 2]
Now pos= [1, 0]
Testing row 1 col 1
Possibles so far [[1, 0], [1, 0], [1, 0], [1, 0]]
Pos= [1, 0]
Now pos= [1, 1]
Testing row 1 col 2
Possibles so far [[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]]
Pos= [1, 1]
Now pos= [1, 2]
Testing row 2 col 0
Possibles so far [[1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]
Pos= [1, 2]
Now pos= [2, 0]
Testing row 2 col 1
Possibles so far [[2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0], [2, 0]]
Pos= [2, 0]
Now pos= [2, 1]
Testing row 2 col 2
Possibles so far [[2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1]]
Pos= [2, 1]
Now pos= [2, 2]
List of equals [[2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]]
答案 0 :(得分:1)
将相同的对象pos
一遍又一遍地附加到列表中。如果在下一个循环中更改其值,则其所有表示也会更改。你可以测试一下。附加在test
函数的末尾:
for item in possibles:
print(item, id(item))
请参阅,所有列表项都具有相同的ID。
为避免这种情况,请在每个循环中指定一个新对象:
def test():
possibles = []
for row in range (3):
for col in range (3):
pos = [row, col] #create a new list
print("Now pos=",pos)
possibles.append(pos) #and append this new element
print("List of equals",possibles)
test()
它看起来很相似,但不是更改现有列表[0]
的元素[1]
和pos
,而是在每个循环中创建一个新列表。如果您使用上面的id(item)
进行检查,possibles
的所有列表元素现在都有不同的ID。