web-dev-qa-db-ja.com

グローバル変数を変更しない関数

私のコードは次のとおりです:

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

何らかの理由で、コードがifステートメントに入ると、function()で終了した後、whileループを終了しません。

しかし、次のようにコーディングすると:

done = False

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

... whileループを終了します。何が起きてる?

私のコードがif-statementに入ることを確認しました。私のコードには多くのループ(かなり大きな2D配列)があるため、デバッガーをまだ実行していません。デバッグが非常に退屈なので、あきらめました。関数内で「完了」が変更されないのはなぜですか?

32
cYn

問題は、関数が独自の名前空間を作成することです。つまり、関数内のdoneは2番目の例のdoneとは異なります。つかいます global done新しいものを作成する代わりに最初のdoneを使用します。

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

globalの使用方法の説明は here にあります。

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

globalキーワードを使用して、グローバル変数doneを参照していることをインタープリターに知らせる必要があります。そうしないと、関数でのみ読み取り可能な別の変数が作成されます。

6
Ionut Hulub

globalを使用してから、グローバル変数を変更できます。そうでない場合は、done = True関数内では、doneという名前の新しいローカル変数を宣言します。

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

グローバルステートメント の詳細をご覧ください。

4