7

the error it returns is:

NameError: name 'lives' is not defined

I know the code isn't as efficient as possible, this is one of my first projects, however whatever i try to do this error pops up, I've tried making a global for it but that didn't help. I would really appreciate some help with this, thanks!

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: putting global lives inside main() returns the error:

UnboundLocalError: local variable 'lives' referenced before assignment
10
  • 1
    Take a look at @chepner's answer. The global declaration should be in the main function. If you do that, your code works fine. Commented Jun 21, 2016 at 21:58
  • General recommendation: avoid global variables. Write functions, not procedures. Python programmers commonly use 4 spaces for indentation. Commented Jun 21, 2016 at 22:05
  • i put the global for all 4, lives, win, rand_num and guess in both compare() and main() and that seemed to have worked, but i'm still unsure if all 4 are needed in both, or which ones are needed where. @Zondo Commented Jun 21, 2016 at 22:10
  • why is avoiding global variables good @Eli Korvigo? (p.s it was the only way i could figure out how to do it, im new to coding as i said in my question ;P) Commented Jun 21, 2016 at 22:12
  • You should declare the variable global if you are setting it in that function. To make x = 4 effect the global namespace, you need x to be declared global. To print x, you don't. Commented Jun 21, 2016 at 22:17

3 Answers 3

9

You need to define the variable "lives" outside of the function main, then any function where you want to reference that global variable you say "global lives." When you are in a function and assign a value to a variable, it assumes it is in the local scope. using "global lives" tells that function to look to the global scope as the reference of lives.

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()
Sign up to request clarification or add additional context in comments.

Comments

2

You didn't declare lives to be global inside main(), so it is local to that function.

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

Comments

0

When you declare it inside function they are only available in that function scope, so declare global variables outside functions and code will work fine.

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()

And now this works fine. For more info about gloval vs local variables you can read: http://www.python-course.eu/global_vs_local_variables.php

2 Comments

the error changes to: UnboundLocalError: local variable 'lives' referenced before assignment
changed my answer, take a look

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.