web-dev-qa-db-fra.com

Variable locale référencée avant affectation en 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)

donc j'ai beaucoup de ficelle sur "trucs" et j'aime trouver une lettre minuscule qui sorrund par 3 lettres majuscules.

mais quand je lance ce code je reçois:

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

je ne comprends pas pourquoi. Merci d'avance

11
Or Halimi

En raison de cette ligne, count +=1, python pense que count est une variable locale et ne cherchera pas la portée globale lorsque vous avez utilisé if count == 3:. C'est pourquoi vous avez cette erreur.

Utilisez l'instruction global pour gérer cela:

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

De docs :

Toutes les affectations de variables dans une fonction stockent la valeur dans la table de symboles locale ; alors que les références de variable recherchent d’abord dans la table de symboles locale, puis dans la table de symboles globale, puis dans la table des noms intégrés. Ainsi, les variables globales ne peuvent pas être affectées directement à Une valeur dans une fonction (sauf si elles sont nommées dans une instruction globale), Bien qu'elles puissent être référencées.

21
Ashwini Chaudhary

En fait, il vaut mieux utiliser nonlocal dans ce cas. Utilisez global aussi économiquement que possible. Plus d'informations sur nonlocal ici docs.python.org/3/reference/simple_stmts.html#nonlocal

1
Colin Schoen