Локальная переменная, привязанная до назначения в Python

Truel=""
count = 0
finle_touch=False #true after it find the first 3 upperletter

# check if there is 1 lower letter after three upper letter
def one_lower(i):
    count=0
    if i == i.lower:
        finle_touch=True
        Truel=i

# check for 3 upper letter
def three_upper(s):
    for i in s:
        if count == 3:
            if finle_touch==True:
                break
            else:
                one_lower(i)
        elif i == i.upper:
            count +=1
            print(count) #for debug
        else:
            count ==0
            finle_touch=False

stuff="dsfsfFSfsssfSFSFFSsfssSSsSSSS......."
three_upper(stuff)
print(Truel)

поэтому я получил много строк в "stuff", и мне нравится находить 1 строчную букву, которая сортируется тремя буквами верхнего регистра.

но когда я запускаю этот код, я получаю:

Traceback (most recent call last):
  File "C:\Python33\mypy\code.py", line 1294, in <module>
    three_upper(stuff)
  File "C:\Python33\mypy\code.py", line 1280, in three_upper
    if count == 3:
UnboundLocalError: local variable 'count' referenced before assignment

Я не понимаю, почему. заранее спасибо

Ответ 1

Из-за этой строки count +=1 python считает, что count является локальной переменной и не будет искать глобальную область, когда вы использовали if count == 3:. Вот почему вы получили эту ошибку.

Используйте оператор global, чтобы обработать это:

def three_upper(s): #check for 3 upper letter
    global count
    for i in s:

От docs:

Все присваивания переменных в функции сохраняют значение в локальном таблица символов; тогда как переменные ссылки сначала просматриваются в локальном таблицу символов, затем в таблице глобальных символов, а затем в таблице встроенных имен. Таким образом, глобальные переменные не могут быть напрямую назначены значение внутри функции (если не указано в глобальном заявлении) хотя на них можно ссылаться.

Ответ 2

В этом случае лучше использовать нелокальное. Используйте глобальный как можно более экономный. Подробнее о нелокальных здесь docs.python.org/3/reference/simple_stmts.html#nonlocal