Python - 将列表附加到另一个列表

时间:2017-12-14 12:48:59

标签: python-3.x

我尝试编写一个具有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]]

1 个答案:

答案 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。