я получаю локальную переменную, на которую ссылаются перед присваиванием, когда использую эту переменную в блоке try-кроме - PullRequest
1 голос
/ 01 ноября 2019

Я получаю

local variable 'flag' referenced before assignment

в питоне. что я тут не так делаю?

flag = 0
def abc():
    while flag <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            flag += 1

abc()

Ответы [ 4 ]

1 голос
/ 01 ноября 2019
flag = 0
def abc(argument):
    while argument <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            argument += 1

abc(flag)
0 голосов
/ 01 ноября 2019

Вы - жертва переменной области видимости в Python. Вам нужно ключевое слово global ( отличный учебник по теме ). В этом случае:

flag = 0

def abc():
    global flag
    while flag <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            flag += 1

abc()

Обратите внимание на новую строку global flag в начале определения abc. Это говорит функции о том, что ключевое слово flag должно исходить из глобальной области, а не из локальной области.

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

0 голосов
/ 01 ноября 2019

Это не вопрос ссылки на эту переменную в try / catch, это вопрос определения этой переменной вне функции, в которой вы ее использовали. flag объявляется вне abc() и не объявляется как глобальное;следовательно, python не верит, что внутри функции есть переменная с именем flag, которую он может использовать. (Если я прав, flag объявлен как часть __main__, поскольку вы можете напечатать его ниже вызова abc() без проблем.)

Если вы намеревались использовать flagкак не что иное как счетчик, перемещение его внутри def работает:

def abc():
    flag = 0
    while flag <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            flag += 1

abc()

Если, однако, вы намеревались использовать его в другом месте, вам придется объявить его как глобальный ( не рекомендуется) или объявить его как локальную переменную, а затем вернуть его. Если он определен внешне, рассмотрите возможность передачи его в качестве параметра abc.

0 голосов
/ 01 ноября 2019
def abc():
    flag = 0
    while flag <= 10:
        try:
            print(10/0)
        except Exception:
            print('yo')
            flag += 1
    return flag

abc()

Я бы использовал это.

...