Quiero hacer una copia de la lista en la función de recursión

def rec(I: List[int]) -> List[int]:
    new_lst = I[:] # <- want to do this only on first call of rec in recursive stack
    # ....(new_lst is edited)

    rec(new_lst)
    return new_lst
3
no1special 10 oct. 2019 a las 19:27

3 respuestas

La mejor respuesta

Una solución es envolverlo en una función de inicializador, luego llamar a esa función de inicializador en su lugar:

def rec(I: List[int]) -> List[int]:
    ....(new_lst is edited)

    rec(new_lst)
    return new_lst

def startrec(I: List[int]) -> List[int]:
    return rec(I[:])
4
Ruzihm 10 oct. 2019 a las 16:30

Una manera de hacer esto es mantener su función original rec, pero agregar una nueva función que rec redefine a sí misma como. Entonces, cualquier declaración que se encuentre en rec se ejecutará exactamente una vez.

def rec(I: List[int]) -> List[int]:
    new_lst = I[:] # only happens on the first call
    rec = _rec # redefine the rec function so the next time it gets called, we call _rec


def _rec(I: List[int]) -> List[int]:
    # ....(new_lst is edited)

    rec(new_lst)
    return new_lst
0
tybug 10 oct. 2019 a las 16:48

Podemos agregar un parámetro más.

def rec(I: List[int], is_first: bool) -> List[int]:
    if is_first:
        new_lst = I[:] 
    # edit new list
    # then
    rec(new_lst, False)
    return new_lst


# call function 
rec(some_list, True)
2
Mr_U4913 10 oct. 2019 a las 16:45
58327343