4

いくつかの異なる例を見てみましたが、なぜこれが機能しないのかよくわかりません。次のようなコードがあるとします。

def loadVariable():
    global count
    count = 0

def loadDictionary():
    location = 'some location'
    global myDict
    myDict = pickle.load(open(location, 'rb'))

def main():
    loadVariable()
    loadDictionary()
    for item in myDict:
        if item.startswith("rt"):
            count += 1
            item = item[3:]

if __name__ == '__main__':
    main()

私の目には、main() メソッドを開始する if ステートメントが実行されます。次に、グローバルな変数が読み込まれ、辞書が読み込まれ、for ループが実行されます。

ただし、コードを実行すると、割り当て前にローカル変数カウントが参照されていると言われます。なぜそれが起こっているのですか?

編集(コメントに書いたことのいくつかを説明):

これは機能しません (ただし、グローバルがここで間違って使用されているためだと思います):

global count

def loadVariables()
    count = 0

def main():
    loadVariables()
    rest of code etc

これも機能しません:

def loadVariables()
    count = 0

def main():
    global count
    loadVariables()
    rest of code etc

これまでのところ、私がそれを機能させる唯一の方法は、上記のリンクを使用することです。これは、次のようにカウントをリストとして扱うことです。

def loadVariables():
    global count
    count = [0]

def main():
    loadVariables():
    rest of code etc
        count[0] += 1
4

3 に答える 3

4

globalは、宣言を含む関数内で、 global 宣言内の名前がglobalグローバル変数を参照することを意味します。「これはグローバル変数です。どこでもグローバル変数として扱います」という意味ではありません。では、グローバル変数を使用することを宣言していないためmain、名前countmyDictローカル変数を参照しています。main

于 2013-08-18T01:09:31.280 に答える
2

count問題は、関数でグローバル変数として宣言していないことです。mainそのため、(最終的に) 割り当てていることをコンパイラが認識すると、それがローカル変数であると見なされます。その値は割り当てられる前に読み取られるため、例外が発生します。

したがって、最も基本的な修正はglobal countの先頭に追加するだけですmain()が、グローバルは避けた方がよいと思います。それらをグローバルに割り当てるのではなく、結果を取得して返さloadVariableないのはなぜですか? でしたloadDictionary場合、 count はローカル変数になり、後で再割り当てしようとしても問題はありません。main()count = loadVariable()

于 2013-08-18T01:07:24.533 に答える
0

globalこれがどのように機能するかの簡単な例です

global_var = 0

def updater():
    global global_var
    global_var += 1


def stuff(x):
    updater()
    return global_var + x

if __name__ == '__main__':
    stuff(2)  # returns 3
于 2013-08-18T01:24:23.370 に答える