44

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

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ステートメントに入力されていることを確認しました。コードに多くのループ(かなり大きな2D配列)があるため、まだデバッガーを実行していません。また、非常に面倒なため、デバッグをあきらめました。関数内にあるときに「完了」が変更されないのはなぜですか?

4

4 に答える 4

58

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

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

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

于 2012-09-30T23:23:35.250 に答える
7
done=False
def function():
    global done
    for loop:
        code
        if not comply:
            done = True

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

于 2012-09-30T23:23:41.707 に答える
7

を使用globalしてください。そうしないと、グローバル変数を変更できます。そうでない場合、関数内のようなステートメントは、次done = Trueの名前の新しいローカル変数を宣言しますdone

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

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

于 2012-09-30T23:23:44.347 に答える
1

classではなくを使用するglobal

グローバル変数を処理する(使用しない)別の方法は、グローバルにしたい関数と変数をクラスでラップすることです。

これはこの特定のケースでは少し重いですが、クラスはプロジェクトに多くの機能と柔軟性を追加します。(個人的に)強くお勧めします。

例えば:

class Processor():
    """Class container for processing stuff."""

    _done = False

    def function(self):
        """A function which processes stuff."""
        # Some code here ...
        self._done = True

# See the flag changing.
proc = Processor()
print('Processing complete:', proc._done)
proc.function()
print('Processing complete:', proc._done)

出力:

Processing complete: False
Processing complete: True
于 2020-01-21T09:35:32.103 に答える