附加时Python列表更新元素

时间:2017-04-29 01:18:27

标签: python list pygame append updating

我有一个python列表,我想附加一个列表。列表声明如下:

data = []

然后我将列表添加到:

[0, 0, 0, 0, 0, 0, 0, 1, 0]

之后我想添加另一个列表:

[0, 0, 0, 0, 0, -1, 0, 1, 0]

然后,当我打印出整个列表时,它会显示:

[[0, 0, 0, 0, 0, -1, 0, 1, 0], [0, 0, 0, 0, 0, -1, 0, 1, 0]]

当我试图将其打印出来时:

[[0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, -1, 0, 1, 0]]

当我刚刚添加它时,它更新了数组的第一个元素:

data.append(prev_board)

并且prev_board存储要附加到列表的列表。我的完整代码是:

def gather_training_data(games):
global data
global game_won

for each_game in range(games):
    game = Game()
    while True:
        pygame.event.get()
        game.create_board()
        if not game_won:
            prev_board = game.board
            move = game.random_move()
            data.append(prev_board)
            print data
            time.sleep(5)
        else:
            break
    game_won = False
    time.sleep(1)
    window.fill((255, 255, 255))

return data

那么为什么当我只将一个列表附加到列表时,列表的第一个元素会更新?

1 个答案:

答案 0 :(得分:4)

你必须使用相同的列表并对其进行变异 - 类似这样的

>>> a = [1,2,3,4,5]
>>> b = []
>>> b.append(a)
>>> b
[[1, 2, 3, 4, 5]]

现在更改a

的内容
>>> a[:4] = [9,9,9,9]
>>> a
[9, 9, 9, 9, 5]
>>> b
[[9, 9, 9, 9, 5]]

>>> b.append(a)
>>> b
[[9, 9, 9, 9, 5], [9, 9, 9, 9, 5]]

现在b包含a 两次

>>> id(b[0]), id(b[1])
(50336328, 50336328)
>>> b[0] is b[1]
True
>>> id(a)
50336328
>>> a is b[0] is b[1]
True
>>> 

为了防止这种情况发生,请创建新的列表以便附加而不是改变相同的列表,或者如果无法帮助,则附加变异列表的副本。
 copy — Shallow and deep copy operations
 How to clone or copy a list?