2012-09-30 23 views
20

mój kod jest następująca:Nie Funkcja Zmiana zmienna globalna

done = False 

def function(): 
    for loop: 
     code 
     if not comply: 
      done = True #let's say that the code enters this if-statement 

while done == False: 
    function() 

Z jakiegoś powodu, gdy mój kod wchodzi if, to nie wyjść z pętli while po to się robi z funkcji().

ale jeśli ja kodować to tak:

done = False 

while done == False: 
    for loop: 
    code 
    if not comply: 
     done = True #let's say that the code enters this if-statement 

... to wyjście z pętli while. Co tu się dzieje?

Upewniłem się, że mój kod wchodzi do instrukcji if. Nie uruchomiłem jeszcze debuggera, ponieważ mój kod ma wiele pętli (dość duża tablica 2D) i zrezygnowałem z debugowania, ponieważ było to bardzo uciążliwe. Jak to się stało, że "zrobione" nie zmienia się, gdy jest w funkcji?

+0

Wiele dzisiejszych pytań zmiennych globalnych Python. – icktoofay

+0

Dziękuję wam! Nie mogę uwierzyć, że to było takie proste, ale z pewnością jest to inny dotyk niż Java/C++ – cYn

Odpowiedz

30

Twoim problemem jest to, że funkcje tworzą własną przestrzeń nazw, co oznacza, że ​​done w ramach funkcji jest inny niż done w drugim przykładzie. Użyj global done, aby użyć pierwszego done zamiast tworzyć nowy.

def function(): 
    global done 
    for loop: 
     code 
     if not comply: 
      done = True 

Wyjaśnienie sposobu korzystania global można znaleźć here

4
done=False 
def function(): 
    global done 
    for loop: 
     code 
     if not comply: 
      done = True 

trzeba użyć słowa kluczowego global niech interpreter wiedzieć, że odnoszą się do zmiennej globalnej done, inaczej to będzie stworzyć inny, który można odczytać tylko w funkcji.

2

użytkowania global, dopiero wtedy można zmodyfikować zmienną globalną inaczej oświadczenie jak done = True wewnątrz funkcji będzie zadeklarować nową zmienną lokalną o nazwie done:

done = False 
def function(): 
    global done 
    for loop: 
     code 
     if not comply: 
      done = True 

Więcej o the global statement.