webentwicklung-frage-antwort-db.com.de

Funktion ändert globale Variable nicht

mein Code ist wie folgt:

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()

Wenn mein Code die if-Anweisung eingibt, wird die while-Schleife aus irgendeinem Grund nicht beendet, nachdem function () ausgeführt wurde.

ABER, wenn ich es so codiere:

done = False

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

... es verlässt die while-Schleife. Was ist denn hier los?

Ich habe dafür gesorgt, dass mein Code in die if-Anweisung eingeht. Ich habe den Debugger noch nicht ausgeführt, weil mein Code viele Schleifen enthält (ziemlich großes 2D-Array), und ich habe das Debuggen aufgegeben, weil es so langweilig ist. Wie kommt es, dass "erledigt" nicht geändert wird, wenn es in einer Funktion ist?

32
cYn

Ihr Problem ist, dass Funktionen einen eigenen Namespace erstellen. Dies bedeutet, dass done innerhalb der Funktion ein anderer ist als done im zweiten Beispiel. Verwenden global done, um den ersten done zu verwenden, anstatt einen neuen zu erstellen.

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

Eine Erklärung zur Verwendung von global finden Sie hier

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

sie müssen das globale Schlüsselwort verwenden, um dem Interpreter mitzuteilen, dass Sie auf die globale Variable done verweisen. Andernfalls wird eine andere Variable erstellt, die nur in der Funktion gelesen werden kann.

6
Ionut Hulub

Verwenden Sie global, nur dann können Sie eine globale Variable ändern, andernfalls eine Anweisung wie done = True innerhalb der Funktion deklariert eine neue lokale Variable mit dem Namen done:

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

Lesen Sie mehr über die globale Anweisung .

4