Невозможно сложить числа в цикле навсегда

голоса
-4

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

UnboundLocalError: local variable 'total' referenced before assignment

Я хотел бы иметь возможность распечатать общий вход добавлен после входа пользователя «бросить курить».

total = 0

def adding_report():
    while True:
        report_type = input(Choose a report type(a or t): )
        while report_type == t:
            value_input = input(Put in a value: )
            if value_input.isdigit() == True:
                total += int(value_input)
            elif value_input == quit:
                print(total)
            else:
                print(invalid)

 adding_report()
Задан 20/10/2018 в 05:38
источник пользователем
На других языках...                            


2 ответов

голоса
1

totalПеременной можно определить за пределами вашей функции является глобальной переменной. Вы не можете присвоить глобальной внутри функции по умолчанию. Вместо этого, любая переменная, назначаемый в функции принимает на себя Python , чтобы быть локальной переменной.

Вы можете сказать компилятору вы хотите, чтобы получить доступ к глобальной переменной с именем totalвместо локальной переменной с таким именем, используя globalутверждение ( global total). После того, как это заявление, ваш total += int(value_input)оператор присваивания изменить глобальную переменную total, и вы не получите сообщение об ошибке о несвязанного локальной переменной (так как глобальная переменная инициализирована в ноль).

Другим решением было бы отказаться от глобальной переменной и вместо того, чтобы инициализировать локальную переменную totalвнутри функции, прежде чем начать добавлять вещи к нему. Я не уверен , я понимаю , как ваши две петли предназначены для работы, но может потребоваться , чтобы total = 0линия перемещается либо в верхней части функции, или в верхней части внешнего контура. Это может быть лучше в некоторых случаях, как локальные переменные быстрее получить доступ, и они не будут загрязнять глобальное пространство имен модуля.

Ответил 20/10/2018 в 05:53
источник пользователем

голоса
0

Я хотел бы изменить вашу функцию следующим образом:

def adding_report():
    total = 0
    report_type = input("Choose a report type(a or t): ")
    while report_type == "t":
        value_input = input("Put in a value: ")
        if value_input.isdigit():
            total += int(value_input)
        elif value_input == "quit":
            print( '-'*40)
            print('Total: {}'.format(total))
            print( '#'*16, 'ENDED', '#'*16)
            break
        else:
            print('Current Total: {}'.format(total))
            print('Invalid value entered. Enter an integer or type "quit" to leave.')

adding_report()

Вы получаете , UnboundLocalError: local variable 'total' referenced before assignmentпотому что переменная totalне определена в функции. Вы можете захотеть сделать Даже после фиксации , вам все еще нужно , по крайней мере один перерывы , чтобы остановить бесконечный цикл. Всегда будет правдой , и вы должны выйти из него. Но вы также должны установить условие , чтобы вырваться из внутреннего цикла.totalglobal variable (global total)UnboundLocalErrorwhile True

В фрагменте кода , который я прилагаю, я снял одно whileзаявление , и я с помощью ifблоков , чтобы сделать сравнение.

Замечания:

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

Ответил 20/10/2018 в 06:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more