追加时Python列表更新元素

标签 python list pygame append updating

我有一个 python 列表,我想在其中 append 一个列表。该列表是这样声明的:

data = []

然后我在列表中 append :

[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]]

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

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

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

最佳答案

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

>>> 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
>>> 

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

关于追加时Python列表更新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43690875/

相关文章:

python - 综合列表中的两个for循环

python - 获得列表联合的最快方法 - Python

python - 在 python 中将列表转换为嵌套列表

python-3.x - ModuleNotFoundError : No module named 'pygame'

python - Pygame/MoviePy - 视频以糟糕的帧率显示,窗口大小比我的屏幕大

python - 无法用 pickle 序列化 pygame.Surface 对象

python - 使用 Boto3 的 S3 存储桶策略

python - 异步执行Python subprocess.Popen with wait()

python - 如何从Elasticsearch获取单个字段计数

Python:解析 thorn 分隔文件 - 代码适用于 Windows,但不适用于 Linux?