Ошибка: UnboundLocalError: локальная переменная «пытается», на которую ссылаются перед назначением

#python

#python

Вопрос:

Я пытаюсь создать простую игру в угадайку для своего класса с графикой и пытаюсь создать счетчик попыток. Это область, в которой мой код идет не так.

 def value():

    guess = int(input("Enter your guess: "))
    if guess > num:
        attempts = attempts   1
        turtle.clearscreen()
        interface()
        tooHigh()
        attempt = turtle.Turtle()
        attempt.speed(0)
        attempt.color("white")
        attempt.penup()
        attempt.hideturtle()
        attempt.goto(-250 , 200)
        attempt.write(guess, font=("Courier", 14, "bold"))
        value()
    elif guess < num:
        attempts = attempts   1
        turtle.clearscreen()
        interface()
        tooLow()
        attempt = turtle.Turtle()
        attempt.speed(0)
        attempt.color("white")
        attempt.penup()
        attempt.hideturtle()
        attempt.goto(-250 , 200)
        attempt.write(guess, font=("Courier", 14, "bold"))
        value()
    elif guess == num:
        attempts = attempts   1
        turtle.clearscreen()
        interface()
        yes()
        attempt = turtle.Turtle()
        attempt.speed(0)
        attempt.color("pink")
        attempt.penup()
        attempt.hideturtle()
        attempt.goto(-250 , 200)
        attempt.write(guess, font=("Courier", 14, "bold", "underline"))
        print ("Correct!")
    else:
        print ("ERROR")

def startScreen():

    begin = input("Start the game?: ")
    if begin == 'yes':
        value()
    elif begin == 'instructions':
        instructions()
        startScreen()
    elif begin == 'no':
        sys.exit()
    else:
        print ("Unrecognised answer.")
        startScreen()

attempts = 0    
num = random.randint(1,1000)  
interface()   
startScreen()
  

Ошибка, которую я получаю,:

 Traceback (most recent call last):
  File "D:DesktopPython ProgramsGame.py", line 154, in <module>        
    `startScreen()`        
  File "D:DesktopPython ProgramsGame.py", line 141, in startScreen        
    `value()`        
  File "D:DesktopPython ProgramsGame.py", line 110, in value        
    `attempts = attempts   1`        
UnboundLocalError: local variable 'attempts' referenced before assignment      
  

Кажется невозможным перейти attempts в функцию, поскольку она постоянно вызывает себя, сбрасывая attempts каждый раз.

Я не уверен, почему это происходит, поэтому буду признателен за любую помощь. Спасибо!

Комментарии:

1. Когда вы назначаете что-то attempts где-то в своей функции, Python по умолчанию будет считать это локальным. Но при первом использовании, при попытке вычисления attempts 1 , ей не было присвоено значение, отсюда и ошибка. Если вы хотите использовать глобальную attempts , вы должны сделать ее явной. Добавьте в начале вашей функции global attempts .

2. Есть ли какая-либо причина, по которой вы хотите отслеживать attempts вне функции? если нет, просто перейдите attempts = 0 к началу функции, чтобы инициализировать локальную переменную в самой функции.

Ответ №1:

Причина, по которой вы получаете эту ошибку, заключается в том, что что-то называется variable scope . Вы определили переменную attempts вне функции value , поэтому функция не распознает какую-либо локальную переменную по имени attempts , если вы явно не поместите оператор global attempts в начало своей функции. Это сообщит функции, что вы хотите использовать переменную attempts , которую вы определили в своей основной программе. Это должно выглядеть так:

 def value():
       global attempts
       #function code
  

В качестве альтернативы, вы можете разрешить вашей функции value принимать аргумент и передавать в него переменную attempts . Это будет выглядеть примерно так:

 def value(attempts):
       #function code
       #you can use the variable attempts as needed, since you're passing it directly into the function

#call the function however you want
attempts = 0
value(attempts)
  

Комментарии:

1. Ах. Я предположил, что вам нужно было определить переменную непосредственно под global . Изменил код, и он работает. Спасибо!

Ответ №2:

В функции, когда вы обращаетесь к переменной для присвоения, она по умолчанию обрабатывается как локальная переменная. Итак, чтобы Python знал, что переменная, которую вы хотите изменить, является глобальной переменной, вы делаете следующее:

 def value():
    global attempts
    
    # rest of your code
  

Комментарии:

1. Я подумал об этом, однако функция вызывает себя позже в коде, что означает, что если я определяю attempts в функции, она постоянно сбрасывает себя.

2. Правильно. Я пропустил ту часть, где вы вызываете value() внутри себя. Это действительно сбросило бы счетчик. Итак, да, это должно быть снаружи. Я обновлю ответ.