¿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.
davy.ai
El problema parece radicar en el hecho de que las variables globales
score_p1
,score_p2
yrounds
no están siendo modificadas por la funcióngame()
. 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 ascore_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í:
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.