Variable in for loop changing

In my chess game I created an AI that now can look 3 steps into the future. Each step I update the the variable Moves in chess_piece that contains an array of moves a chess_piece can make.

The problem is, if I update the Moves for Board.Pieces deeper in my algorithm, it also seems to update the NewPieces in the for loop at the beginning of the algorithm. Is there a way so that NewPieces in this for loop does not update if I update the pieces later on in the algorithm?
image

The entire recursive function for my algorithm
Board.UpdateBoardState(Depth) updates the array Moves for all chess_piece in Board

GenerateAlphaBetaTree(Board:board,Depth:int, Alpha:int, Beta:int)<suspends>:tuple(chess_piece,move,int)={
        
        if(Mod[PositionsChecked,25] = 0):
            #Print("positions checked = {PositionsChecked}")
            Sleep(0.003)
        if(Depth = 0){
            set PositionsChecked += 1
            Score := EvaluateState(Board,Board.Turn)
            if(Board.Turn= color.White):
               # Print("awe at root with score {Score} for color white")
            else:
               # Print("awe at root with score {Score} for color black")
            return (chess_piece{},move{},Score)
        }
        else:
            set Nodes += 1
            var Alphaa:int = -10000
            var Betaa:int = 10000
            var X:int = 0
            var Best:tuple(chess_piece,move,int) = (chess_piece{},move{},-10000)
            var NumPositions:int = 0
            if(Board.Turn = AIColor):
                set Best = (chess_piece{},move{},-10000)
                set X = -10000 
            else:
                set Best = (chess_piece{},move{},10000)
                set X = 10000


            Board.UpdateBoardState(Depth)
            NewPieces:=Board.Pieces
            for(Piece:NewPieces):
                if(Piece.Color = Board.Turn):
                    for(Move:Piece.Moves):
                        set NumPositions += 1
                        #Print("move {Move.Start} to {Move.Target} total moves for this are {Piece.Moves.Length} wi d {Depth}")
                        Tuple := SimulateMove(Board,Piece,Move.Target)
                        MaybeSlainPiece := Tuple(0)
                        MaybePromotedPiece := Tuple(1)

                        set Board.Turn = FlipColor(Board.Turn)

                        Triple := GenerateAlphaBetaTree(Board,Depth-1, Alpha, Beta)
                        Score := Triple(2)
                        set Board.Turn = FlipColor(Board.Turn)


                        if(Board.Turn <> AIColor):
                           # Print("eval player move {Move.Start} to {Move.Target} with score {Score} , best {Best(2)}")
                            if(Score <= Best(2)): # if score <  +infinite
                                set Best = (Piece,Move,Score)
                        else if(Board.Turn = AIColor):
                            #AI evaulated board, return highest number
                            #Print("eval ai move {Move.Start} to {Move.Target} with score {Score} , best {Best(2)}")
                            if(Score >= Best(2)): # if score > -infinite
                                set Best = (Piece,Move,Score)


                        #Print("undo move")
                        UndoMove(Board,Piece,Move,MaybeSlainPiece,MaybePromotedPiece)
            if(NumPositions = 0):
                #set PositionsChecked += 1
                Score := EvaluateState(Board,Board.Turn)
                if(Board.Turn= color.White):
                    #Print("++++we at early root with score {Score} for color white")
                else:
                    #Print("+++++we at early root with score {Score} for color black")
                return (chess_piece{},move{},Score)

                        
           # Print("----------- Checked {NumPositions} board positions and total positionschecked = {PositionsChecked}")  
            if(Board.Turn = AIColor):
              #  Print("AI: best was move{Best(1).Start} to {Best(1).Target} with ID {Best(0).ID} and score {Best(2)} ------")
            else:
                #Print("Player: best was move to {Best(1).Target} with ID {Best(0).ID} and score {Best(2)} -------")
            return Best
    }