Python 追加时列出更新元素
Python list updating elements when appending
我有一个 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
那么,当我只向列表追加一个列表时,为什么列表的第一个元素会更新?
您必须使用相同的列表并对其进行修改 - 类似这样
>>> 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?
我有一个 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
那么,当我只向列表追加一个列表时,为什么列表的第一个元素会更新?
您必须使用相同的列表并对其进行修改 - 类似这样
>>> 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?