Почему список меняется, когда я меняю другой?

#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