Python: ¿por qué cambia el valor de esta variable?
Estoy aprendiendo recursión y me encontré con este código (no es mío: https://github.com/kying18/sudoku) y no puedo entender por qué la variable example_board cambia de valor. ¡Nunca se vuelve a mencionar y no hay ninguna otra variable vinculada a ella! ¡Lo probé y lo hace!
Aquí está la versión condensada del código relevante:
def find_next_empty(puzzle):
# devuelve una fila y columna para un cuadro vacío
def is_valid(puzzle, guess, row, col):
# comprueba si el guess es Verdadero o Falso
def solve_sudoku(puzzle):
row, col = find_next_empty(puzzle)
if row is None: # esto es Verdadero si nuestra función find_next_empty devuelve None, None
return True
for guess in range(1, 10): # range(1, 10) es 1, 2, 3, ... 9
if is_valid(puzzle, guess, row, col):
puzzle[row][col] = guess
if solve_sudoku(puzzle):
return True
puzzle[row][col] = -1
return False
si name == ‘main‘:
example_board = [
[3, 9, -1, -1, 5, -1, -1, -1, -1],
[-1, -1, -1, 2, -1, -1, -1, -1, 5],
[-1, -1, -1, 7, 1, 9, -1, 8, -1],
[-1, 5, -1, -1, 6, 8, -1, -1, -1],
[2, -1, 6, -1, -1, 3, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, -1, -1, 4],
[5, -1, -1, -1, -1, -1, -1, -1, -1],
[6, 7, -1, 1, -1, 5, -1, 4, -1],
[1, -1, 9, -1, -1, -1, 2, -1, -1]
]
print(solve_sudoku(example_board))
print(example_board)
”’
davy.ai
La razón por la que
example_board
cambia de valor es porque es un objeto mutable (específicamente, una lista de listas), y en Python, los objetos mutables se pasan por referencia. Esto significa que cuando se pasaexample_board
a la funciónsolve_sudoku
, cualquier cambio realizado en el parámetropuzzle
dentro de la función también afectará a la variableexample_board
fuera de la función.En la función
solve_sudoku
, el parámetropuzzle
se actualiza asignando un nuevo valor al elementopuzzle[fila][columna]
. Esto actualiza efectivamente también la variableexample_board
.Si no quieres que
example_board
cambie de valor, puedes crear una copia antes de pasarla a la funciónsolve_sudoku
. Por ejemplo, puedes reemplazar la línea donde se defineexample_board
con:Aquí, creamos una copia de
example_board
usando una comprensión de lista, y la asignamos a una nueva variable llamadacopy_board
. Luego pasamoscopy_board
a la funciónsolve_sudoku
en lugar deexample_board
. De esta manera, cualquier cambio realizado encopy_board
dentro de la función no afectará alexample_board
original.