9

私はここでおかしくなりそうだと思います。

url_request = 0

def somefunction():
    url_request+=1

if __name__ =='__main__':
    somefunction()

UnboundLocalErrorが表示されます。ここで欠けている重要な概念は何ですか?

4

2 に答える 2

11

グローバル変数に割り当てています。つまり、グローバル変数としてマークする必要があります。

def somefunction():
    global url_request
    url_request+=1

globalローカルスコープ内の変数に割り当てる場合、ステートメントを使用してPythonに最初に指示しない限り、ローカル変数であると見なされます。

于 2012-12-10T10:00:41.913 に答える
6

Python 2.7 では、変数の型が必要です: グローバル、ローカル。各関数は、変数に対して独自のローカル スコープを作成します。

ローカル スコープからは、制限なしで読み取ることができます。グローバル オブジェクト メソッドを呼び出すこともできるため、グローバルから変数を変更できます。ただし、値を再割り当てすることはできません。

このコードを見てください:

requests = [1,2,3]

def modify():
    requests.append(4)

def redeclare():
    requests = [10,20,30]

modify()
print requests
# will give you [1,2,3,4]

redeclare()
print requests
# will give you [1,2,3,4]

どうしたの?ローカルスコープから変数を再割り当てすることはできないrequestsため、インタープリターは他のredeclare変数を作成します-呼び出しコンテキストのローカルスコープで。

あなたのコードに関して...まず、グローバルスコープから変数を再割り当てしようとします。なんで?url_requestは不変であるため、操作intは値を変更しません。新しい値を変数名に再割り当てする必要があります。次に、この変数の識別を指定しません。したがって、インタープリターの唯一のオプションは、ローカル変数として想定することです。しかし...あなたはその価値をどこにも宣言していません....inturl_request+=1globalurl_request

UnboundLocalError前に宣言せずに変数値で操作を実行しようとすることを意味します。これが、Python の変数/名前/スコープについて理解を深めるのに役立つことを願っています。

于 2012-12-10T10:18:18.830 に答える