#python #list
#python #Список
Вопрос:
список «startboard» изменяется, когда я этого не делаю
def moves(board, player):
boardlist=[]
for x in range(7):
newboard=board
if board[5][x]==0:
place=0
if player:
newboard[place][x]=1
else:
newboard[place][x]=2
boardlist.append(newboard)
return boardlist
startboard=[[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]]
moves(startboard, True)
я добавил индексы в newboard=board[:][:]
, и это все равно не сработало
как я могу остановить изменение списка начальной панели?
Комментарии:
1.
newboard=board[:][:]
это мелкая копия мелкой копии. Это не 2-уровневая копия.2. используйте
copy.deepcopy
see docs.python.org/3/library/copy.html
Ответ №1:
попробуйте:
from copy import deepcopy
def moves(board, player):
boardlist=[]
for x in range(7):
newboard = deepcopy(board)
if board[5][x]==0:
place=0
if player:
newboard[place][x]=1
else:
newboard[place][x]=2
boardlist.append(newboard)
return boardlist
startboard=[[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]]
moves(startboard, True)
Вы можете найти объяснение здесь: https://www.geeksforgeeks.org/copy-python-deep-copy-shallow-copy /
Ответ №2:
newboard=board[:][:]
это мелкая копия, она имеет те же ссылки, что и исходный объект. Документы объясняют разницу между мелкими и глубокими копиями:
Разница между мелким и глубоким копированием актуальна только для составных объектов (объектов, которые содержат другие объекты, такие как списки или экземпляры классов):
- Мелкая копия создает новый составной объект, а затем (насколько это возможно) вставляет в него ссылки на объекты, найденные в оригинале.
- Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.
Вот небольшая демонстрация:
import copy
a = [1, 2, 3]
b = [4, 5, 6]
c = [a, b]
Использование обычных операций присваивания для копирования:
d = c
print id(c) == id(d) # True - d is the same object as c
print id(c[0]) == id(d[0]) # True - d[0] is the same object as c[0]
Использование мелкой копии:
d = copy.copy(c)
print id(c) == id(d) # False - d is now a new object
print id(c[0]) == id(d[0]) # True - d[0] is the same object as c[0]
Использование глубокой копии:
d = copy.deepcopy(c)
print id(c) == id(d) # False - d is now a new object
print id(c[0]) == id(d[0]) # False - d[0] is now a new object