Python列表追加时更新元素

Loa*_*222 3 python pygame updating list append

我有一个 python 列表,我想将一个列表附加到其中。该列表是这样声明的:

data = []
Run Code Online (Sandbox Code Playgroud)

然后我在列表中附加:

[0, 0, 0, 0, 0, 0, 0, 1, 0]
Run Code Online (Sandbox Code Playgroud)

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

[0, 0, 0, 0, 0, -1, 0, 1, 0]
Run Code Online (Sandbox Code Playgroud)

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

[[0, 0, 0, 0, 0, -1, 0, 1, 0], [0, 0, 0, 0, 0, -1, 0, 1, 0]]
Run Code Online (Sandbox Code Playgroud)

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

[[0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, -1, 0, 1, 0]]
Run Code Online (Sandbox Code Playgroud)

当我像这样附加它时,它更新了数组的第一个元素:

data.append(prev_board)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

wwi*_*wii 6

你必须使用相同的列表并改变它 - 像这样

\n\n
>>> a = [1,2,3,4,5]\n>>> b = []\n>>> b.append(a)\n>>> b\n[[1, 2, 3, 4, 5]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在更改内容a

\n\n
>>> a[:4] = [9,9,9,9]\n>>> a\n[9, 9, 9, 9, 5]\n>>> b\n[[9, 9, 9, 9, 5]]\n\n>>> b.append(a)\n>>> b\n[[9, 9, 9, 9, 5], [9, 9, 9, 9, 5]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在b包含a 两次

\n\n
>>> id(b[0]), id(b[1])\n(50336328, 50336328)\n>>> b[0] is b[1]\nTrue\n>>> id(a)\n50336328\n>>> a is b[0] is b[1]\nTrue\n>>> \n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

为了防止这种情况发生,请创建新的列表来附加,而不是改变同一个列表,或者在无法帮助的情况下附加改变列表的副本。
\n copy \xe2\x80\x94 浅复制和深复制操作
\n如何克隆或复制列表?

\n

  • 那么我能做些什么来防止这种情况发生呢? (2认同)