Как сделать глубокую копию определенного (изменяемого) объекта?

Я пытаюсь сделать шахматный движок.

def botmove(board):
  legal=list(board.legal_moves)#needed because --->TypeError: 'LegalMoveGenerator' object is not subscriptable
  boardhalfmove=board.pop()
  choosemove(board,boardhalfmove, legal)
  print("Computer moves:",move)
  movepiece(move,board)

Однако я столкнулся с ошибкой, где:

Traceback (most recent call last):
  File "main.py", line 32, in <module>
    botmove(board)
  File "/home/runner/chess-engine-goal-3minimax/move.py", line 70, in botmove
    choosemove(board,boardhalfmove, legal)
  File "/home/runner/chess-engine-goal-3minimax/move.py", line 49, in choosemove
    movepiece(str(i),board)
  File "/home/runner/chess-engine-goal-3minimax/move.py", line 4, in movepiece
    moveinput = str(board.push_san(movestr))
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/chess/__init__.py", line 3003, in push_san
    move = self.parse_san(san)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/chess/__init__.py", line 2970, in parse_san
    move = self.find_move(square(from_file, from_rank), to_square, promotion)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/chess/__init__.py", line 2272, in find_move
    raise ValueError(f"no matching legal move for {move.uci()} ({SQUARE_NAMES[from_square]} -> {SQUARE_NAMES[to_square]}) in {self.fen()}")
ValueError: no matching legal move for g8h6 (g8 -> h6) in rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

Это нехорошо, особенно часть legal move. Я вернулся к источнику ошибки:

boardhalfmove=board.pop()

Я знаю о причудливой изменчивости Python, и хотя я знаю, что могу скопировать такой список:

secondlist=list[:]#makes a copy

type(board) возвращает<class 'chess.Board'>.
Как сделать полную копию board?
Заранее спасибо.


person NRO    schedule 08.01.2021    source источник
comment
Вы уже пробовали читать этот docs.python.org/3/library/copy.html или stackoverflow.com/questions/48338847/ ?   -  person Elidor00    schedule 09.01.2021


Ответы (1)


Как правило, в Python есть библиотека с именем «copy», которая реализует глубокое копирование основных объектов. Попробуйте использовать from copy import deepcopy и переопределить функцию __eq__ Board.

Для получения дополнительной информации взгляните на Как можно Я создаю копию объекта в Python?

person Noga K    schedule 08.01.2021