Python NameError, variable ‘no definida’

el error que devuelve es:

NameError: name 'lives' is not defined 

Sé que el código no es lo más eficiente posible, este es uno de mis primeros proyectos, sin embargo, lo que sea que intente hacer este error aparece, he intentado hacer un global para él pero eso no ayudó. Realmente agradecería alguna ayuda con esto, gracias!

 import random import time def main(): global guess,rand_num win = False rand_num = 45 lives = 10 while lives > 0 and win == False: guess = int(input("Guess a number!")) compare() print("Well done!") time.sleep(3) def compare(): global lives,win if guess == rand_num: print("You guessed correct!") win = True elif guess > rand_num: print ("Guess lower!") lives = lives - 1 else: print ("Guess higher!") lives = lives - 1 def repeat(): replay = input("would you like to play again? Y/N") if replay == "Y": print("enjoy!") main() elif replay == "N": "Goodbye then, hope you enjoyed!" time.sleep(3) os._exit else: print("please enter Y or N") repeat() main() repeat() 

EDIT: poniendo vidas globales dentro de main () devuelve el error:

 UnboundLocalError: local variable 'lives' referenced before assignment 

Debe definir la variable “vidas” fuera de la función principal, luego cualquier función en la que desee hacer referencia a esa variable global que dice “vidas globales”. Cuando está en una función y asigna un valor a una variable, se supone que está en el ámbito local. el uso de “vidas globales” le dice a esa función que considere el scope global como la referencia de vidas.

 import random import time lives = 10 win = False guess = 0 rand_num = 45 def main(): global guess, rand_num, lives, win win = False rand_num = 45 lives = 10 while lives > 0 and win == False: guess = int(input("Guess a number!")) compare() print("Well done!") time.sleep(3) def compare(): global guess, rand_num, lives, win if guess == rand_num: print("You guessed correct!") win = True elif guess > rand_num: print ("Guess lower!") lives = lives - 1 else: print ("Guess higher!") lives = lives - 1 def repeat(): replay = input("would you like to play again? Y/N") if replay == "Y": print("enjoy!") main() elif replay == "N": "Goodbye then, hope you enjoyed!" time.sleep(3) os._exit else: print("please enter Y or N") repeat() main() repeat() 

No declaraste que las lives sean globales dentro de main() , por lo que es local para esa función.

 def main(): global guess, rand_num, lives ... 

Cuando lo declara dentro de la función, solo están disponibles en el scope de esa función, por lo tanto, declare las variables globales fuera de las funciones y el código funcionará bien.

 import random import time guess = None random_num = None lives = 3 win = False def main(): global guess,rand_num win = False rand_num = 45 lives = 10 while lives > 0 and win == False: guess = int(input("Guess a number!")) compare() print("Well done!") time.sleep(3) def compare(): global lives,win if guess == rand_num: print("You guessed correct!") win = True elif guess > rand_num: print ("Guess lower!") lives = lives - 1 else: print ("Guess higher!") lives = lives - 1 def repeat(): replay = input("would you like to play again? Y/N") if replay == "Y": print("enjoy!") main() elif replay == "N": "Goodbye then, hope you enjoyed!" time.sleep(3) os._exit else: print("please enter Y or N") repeat() main() repeat() 

Y ahora esto funciona bien. Para obtener más información sobre las variables locales y de gloval, puede leer: http://www.python-course.eu/global_vs_local_variables.php