2017-01-03 5 views
1

Wenn der Benutzer die Zahl 0 eingibt und das Programm task0 ausführt, endet die while-Schleife nicht wie beabsichtigt. Warum ist das und wie repariere ich es?Logischer Fehler, der unendliche while-Schleife verursacht

def task0(): 
    print("Goodbye") 
    end = "true" 
end = "false" 
while end != "true": 
    print() 
    tasknum = input("Which task would you like to see? ") 
    print() 
    task = "task" + tasknum 
    methodToCall = globals()[task] 
    result = methodToCall() 
+4

Sie müssen 'globales Ende' innerhalb von Task0 definieren – depperm

+5

Warum verwenden Sie nicht boolesche Werte (True, False)? – depperm

+2

Verwenden Sie bitte auch eine "Liste" von Aufgaben, anstatt nach Variablen in 'globals' zu suchen. –

Antwort

4

Es ist am besten, mit Ihrer Funktion zu kommunizieren, indem Sie Rückgabewerte verwenden und globale Namen nicht ändern.

Verwenden Sie auch True und False, es ist kein Stringvergleich erforderlich.

Kurz gesagt, das Rück True von Ihrer Funktion und weisen es end:

def task0(): 
    print("Goodbye") 
    return True 

end = False 
while not end: 
    print() 
    tasknum = input("Which task would you like to see? ") 
    print() 
    task = "task" + tasknum 
    methodToCall = globals()[task] 
    end = methodToCall() 

Sie dann auf das überprüfen und entsprechend beenden.

+0

Auch, wie @tobias_k im obigen Kommentar sagt, ist es möglicherweise sicherer, eine Liste gültiger Aufgaben zu verwenden. '[task0, task1, ...]' – synchronizer

+0

Sicher in welchem ​​Sinn @synchronizer? In "Globals" zu schauen und zu verändern, ist vollkommen sicher. Es ist * völlig * kontraintuitiv und wird Verwirrung stiften, aber es gibt kein Problem mit der Sicherheit hier :-) –

+1

Globals korrupt den Verstand. (Das ist ein Witz :)). – synchronizer

Verwandte Themen