2017-01-03 24 views
1

ユーザーが数字0を入力してプログラムがtask0を実行すると、whileループは意図したとおりに終了しません。これはなぜですか、どうすれば修正できますか?無限ループを引き起こす論理エラー

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

task0内で 'global end'を定義する必要があります – depperm

+5

なぜブール値を使用していませんか(True、False)? – depperm

+2

また、グローバル変数で変数変数を調べる代わりに、タスクのリストを使用してください。 –

答えて

4

グローバル名を変更するのではなく、戻り値を使用して関数と通信することをお勧めします。

また、TrueFalseを使用すると、文字列比較を使用する必要はありません。

要するに、あなたの関数からTrueを返し、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() 

あなたは、その上でチェックし、適切に終了します。

+0

また、上記のコメントで@tobias_kが述べているように、有効なタスクのリストを使用する方が安全かもしれません。 '[task0、task1、...]' – synchronizer

+0

どのような意味で安全です@シンクロナイザー? 'グローバル変数を探すと変更することは完全に安全です。これは完全に直観的で直観的で混乱の原因になりますが、ここで安全性に関する問題はありません:-) –

+1

グローバルは心を傷つけます。 (冗談です :) )。 – synchronizer

関連する問題