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.

¿Cómo puedo alejarme de las variables globales en Python?

En este ejemplo, si intercambio el código comentado, las variables globales funcionan correctamente. Parece que no logro entender algo fundamental sobre Python aquí, ya que pasar las variables no parece funcionar correctamente.

import random

def roll_die(sides=6):
    return random.randint(1, sides)

def game(score_p1, score_p2, rounds):
    roll_1 = roll_die()
    roll_2 = roll_die()
    winner = None
    if roll_1 > roll_2:
        score_p1 = score_p1 + 1
        score_p2 = score_p2 - 1
        winner = 'player 1'
    if roll_1 < roll_2:
        score_p1 = score_p1 - 1
        score_p2 = score_p2 + 1
        winner = 'player 2'
    if roll_1 == roll_2:
        winner = 'Nadie'
    print(f'p1 lanzó {roll_1} y p2 lanzó {roll_2}: El ganador es {winner}')    
    print(score_p1, score_p2)
    rounds = rounds + 1
    return score_p1, score_p2, rounds

if __name__ == 'main':
    tokens = 5
    score_p1 = tokens
    score_p2 = tokens
    rounds = 0

    while True:
        if (score_p1 <= 0) or (score_p2 <= 0):
            print(f'Puntaje Final: {score_p1}:{score_p2} con {rounds} rondas')
            break
        else:
            game(score_p1, score_p2, rounds)

Resultados de ejemplo que obtengo de la versión “no global”:

“`
p1 lanzó 3 y p2 lanzó 1: El ganador es Jugador 1
6 4
p1 lanzó 1 y p2 lanzó 4: El ganador es Jugador 2
4 6
p1 lanzó 5 y p2 lanzó 3: El ganador es Jugador 1
6 4
p1 lanzó 3 y p2 lanzó 1: El ganador es Jugador 1
6 4
p1 lanzó 4 y p2 lanzó 4: El ganador es Nadie
5 5
p1 lanzó 2 y p2 lanzó 2: El ganador es Nadie
5 5

…Y el juego se repite para siempre.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece radicar en el hecho de que las variables globales score_p1, score_p2 y rounds no están siendo modificadas por la función game(). Cuando el código comentado se elimina, las variables son modificadas correctamente porque se están referenciando como globales dentro de la función. Sin embargo, al pasar las variables como argumentos a la función, se tratan como variables locales dentro del alcance de la función. Por lo tanto, cualquier modificación realizada a estas variables dentro de la función no afectará a las variables fuera de la función.

    Para solucionar esto, es posible devolver las variables modificadas desde la función y reasignarlas fuera de la función. En este caso, la línea game(score_p1, score_p2, rounds) debería cambiarse a score_p1, score_p2, rounds = game(score_p1, score_p2, rounds). Esto asegurará que las variables fuera de la función sean modificadas con los valores actualizados desde dentro de la función.

    El código corregido debería verse así:

    import random
    
    def roll_die(sides=6):
        return random.randint(1, sides)
    
    def game(score_p1, score_p2, rounds):
        roll_1 = roll_die()
        roll_2 = roll_die()
        winner = None
    
        if roll_1 > roll_2:
            score_p1 += 1
            score_p2 -= 1
            winner = 'Jugador 1'
        elif roll_1 < roll_2:
            score_p1 -= 1
            score_p2 += 1
            winner = 'Jugador 2'
        else:
            winner = 'Nadie'
    
        print(f'El Jugador 1 sacó {roll_1} y el Jugador 2 sacó {roll_2}: El ganador es {winner}')
        print(score_p1, score_p2)
        rounds += 1
    
        return score_p1, score_p2, rounds
    
    if __name__ == '__main__':
        tokens = 5
        score_p1 = tokens
        score_p2 = tokens
        rounds = 0
    
        while True:
            if (score_p1 <= 0) or (score_p2 <= 0):
                print(f'Puntuación final: {score_p1}:{score_p2} con {rounds} rondas')
                break
            else:
                score_p1, score_p2, rounds = game(score_p1, score_p2, rounds)
    

    Esto debería modificar correctamente las variables globales desde dentro de la función y permitir que el juego termine una vez que uno de los puntajes llegue a cero.

Comments are closed.