2016-06-21 2 views
0

ошибка возвращается в:Python NameError, переменная «не определено»

NameError: name 'lives' is not defined 

Я знаю, что код не так эффективно, как это возможно, это одна из моих первых проектов, однако все, что я пытаюсь сделать эта ошибка появляется, я пробовал сделать глобальный для нее, но это не помогло. Я бы очень признателен за помощь в этом, спасибо!

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: положить глобальные жизни внутри основной() возвращает ошибку:

UnboundLocalError: local variable 'lives' referenced before assignment 
+0

Посмотрите на ответ @ chepner. Декларация 'global' должна быть в' main'. Если вы это сделаете, ваш код будет работать нормально. – zondo

+0

Общая рекомендация: избегать глобальных переменных. Напишите функции, а не процедуры. Программисты Python обычно используют 4 пробела для отступов. –

+0

Я поставил глобальный для всех 4, жизни, win, rand_num и угадал как в compare(), так и в main(), и это, казалось, сработало, но я все еще не уверен, нужны ли все 4 в обоих, или какие из них нужен где. @Zondo – Kaos

ответ

1

Вам нужно определить переменную «жизни» вне функции main, а затем любую функцию, в которой вы хотите ссылаться на эту глобальную переменную, которую вы говорите «глобальная жизнь». Когда вы находитесь в функции и присваиваете значение переменной, она предполагает, что она находится в локальной области. использование «глобальных жизней» говорит о том, что функция взглянуть на глобальную сферу как на ссылку жизни.

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

Вы не декларировать lives быть глобальным внутри main(), поэтому является локальной для этой функции.

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

Когда вы объявляете его внутри функции они доступны только в этой области видимости функции, поэтому объявлять глобальные переменные вне функции и код будет работать нормально.

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

И теперь это нормально работает. Для получения дополнительной информации о gloval vs local variables вы можете прочитать: http://www.python-course.eu/global_vs_local_variables.php

+0

ошибка изменяется на: UnboundLocalError: локальная переменная 'lives', на которую ссылаются перед назначением – Kaos

+0

изменил мой ответ, взгляните – Teemo

Смежные вопросы