3
# coding: utf-8

def func():
    print 'x is', x
    #x = 2   #if I add this line, there will be an error, why?
    print 'Changed local x to', x
x = 50
func()
print 'Value of x is', x 
  1. in func関数を追加しませんglobal xが、それでもx50であることがわかります。なぜですか?
  2. x=2func関数に行を追加すると、エラー( UnboundLocalError: local variable 'x' referenced before assignment)が発生します。なぜですか?
4

3 に答える 3

5

ここでの秘訣は、ローカル名が静的に検出されることです。

  • x関数で名前が割り当てられていない限りx、グローバルスコープに解決するための参照
  • 名前が関数のどこかxに割り当てられている場合、Pythonはそれが関数のどこでもローカル名であると想定します。結果として、割り当てられる前にローカル名が使用されるため、最初の行はエラーになります。xx

言い換えると、割り当てられた名前は、割り当てられたポイントの直後ではなく、関数内のすべての場所でローカルとして扱われます。

于 2012-04-13T10:31:44.417 に答える
4

キーワードは、globalグローバルへの書き込みにのみ必要です。

グローバルとして宣言されていない変数に割り当てると、その名前のローカル変数が作成されるため、エラーが発生します。割り当てられる前にそのスコープで参照しxているため、まだ割り当てられていないローカル変数を読み取ろうとしています。

于 2012-04-13T10:12:56.437 に答える
3

Pythonは、かなり一般的な変数スコープを使用します。非ローカル変数は関数内に表示されます。

globalグローバルスコープ内の変数に割り当てる場合にのみ、キーワードが必要です。また、グローバルスコープと外部スコープの違いにも注意する必要があります。影響を考慮してください:

x = 'global'
def f():
    x = 'local in f'
    def g():
        global x 
        x = 'assigned in g'
    g()
    print x

f()上記のコードを実行すると、グローバルスコープがに設定されているlocal in f間にが出力されます。x'assigned in g'


Python 3の時点でnonlocal、外部スコープから変数に割り当てることができるキーワードもあります。

x = 'global'
def f():
    x = 'local in f'
    def g():
        nonlocal x 
        x = 'assigned in g'
    return g
    print(x)

f()上記のコードを実行すると、グローバルスコープのg (which is the value ofx in local scope off()), while value ofx`に割り当てられた'が出力されます。

Pythonは字句(静的)スコープを使用するため、次のコードはグローバルスコープのを変更しないことにも注意してください。x

x = 'global'
def f():
    x = 'local in f'
    def g():
        nonlocal x 
        x = 'assigned in g'
    return g
g = f()
g()
于 2012-04-13T10:16:19.070 に答える