es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
”’

Tags:  , ,

Answer

  1. Avatar for 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 pasa example_board a la función solve_sudoku, cualquier cambio realizado en el parámetro puzzle dentro de la función también afectará a la variable example_board fuera de la función.

    En la función solve_sudoku, el parámetro puzzle se actualiza asignando un nuevo valor al elemento puzzle[fila][columna]. Esto actualiza efectivamente también la variable example_board.

    Si no quieres que example_board cambie de valor, puedes crear una copia antes de pasarla a la función solve_sudoku. Por ejemplo, puedes reemplazar la línea donde se define example_board con:

    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]
    ]
    
    copy_board = [fila[:] for fila in example_board] # hacer una copia de example_board
    print(solve_sudoku(copy_board))
    print(example_board) # example_board debería permanecer sin cambios
    

    Aquí, creamos una copia de example_board usando una comprensión de lista, y la asignamos a una nueva variable llamada copy_board. Luego pasamos copy_board a la función solve_sudoku en lugar de example_board. De esta manera, cualquier cambio realizado en copy_board dentro de la función no afectará al example_board original.

Comments are closed.