2012-01-23 11 views
0
gCharlie = 0 
gJeff = 0 

def Bob(): 
    Charlie = gCharlie 
    Jeff = gJeff 
    Number = int(input("Hello and Welcome to Charlie's Number Guessing Game. Enter a nonnegative number from 0 to 10 not counting 0. ")) 

は、このコードは、私にはPython 3.2でこのエラーを与える:のPython 3.2.2エラーローカル変数

UnboundLocalError: local variable 'gCharlie' referenced before assignment 

このローカル変数のエラーは何を意味するのでしょうか?

+4

私はこのコードを自分で実行しましたが、そのようなエラーはありませんでした。おそらくこの関数を呼び出すコードを提供するでしょうか?それは別のファイルですか?もしそうなら、どうやってインポートしていますか? –

+3

私はPythonの2つの異なるバージョンで上記を試してみましたが、それは完璧に動作しました。 – senderle

答えて

3

あなたの関数のスコープ内に新しいローカル変数として作成したgJeffとgCharlieを再割り当てする必要があります。 Pythonにグローバルを使用していることを伝えるには、関数の先頭を次のように変更します。

def Bob(): 
    global gCharlie 
    global gJeff 
    Charlie=gCharlie 

あなたはグローバルを使用しているのpythonを告げず、それはあなたの関数にその時点で割り当てられていない、それが言うように、ローカルgCharlieとgJeff変数を、参照しよう。人々がそれを働かせる理由は、あなたが投稿したコードだけを使用しているからです。グローバル変数を参照する関数内で値を変更しない場合にのみ、グローバル変数を明示的に指定することなく参照することができます。

原則として、pythonはローカルスコープ、グローバルスコープ内でネストされた任意の変数名の順に検索します。 gJeffとgCharlieはあなたの関数のローカル変数ですが、それ以外のことを言わない限り、そこでは停止します。

あなたはこの動作を確認したい場合は、関数内で、xは新しいローカル変数として作成されているため、この

x=5 

def useX(): 
    x=0  #this is a local variable 
    print "in function: ", x 

def main(): 
    print "in main(1): ", x 
    useX() 
    print "in main(2): ", x 

main() 

この意志出力

in main(1): 5 
in function: 0 
in main(2): 5 

を見てみてください。 useX関数にグローバルxステートメントを追加すると、最後の行が "5"ではなく "0"に変更されます。

+1

* "デフォルトではグローバルを認識できません" *は誤解を招くようです。たとえば、モジュールレベルで 'import some_module 'を使って紹介するモジュール名は、通常どんな関数でも使用できる通常のグローバルです。関数内でバインディングを変更しない場合は、 'global'は必要ありません。[example](http://ideone.com/J2s6K)。必要な場合は、関数をメソッドにリファクタリングし、グローバルをインスタンス属性にリファクタリングする必要があります。 – jfs

+0

さらに明白な例は関数名です。 'main()'の中で 'useX()'を呼び出すために 'global useX'は必要ありません。 – jfs

+0

この回答は間違っています。 –

2

機能内にgCharlie =がある可能性があります(注:最初の文字はgです)。代わりに、グローバルの

使用パラメータ:

def bob(charlie=0, jeff=0): 
    number = int(input("...")) 
    # ... 

bob(charlie=3) 
2

それはあなたが表示されなかった機能の一部にgCharlieに代入していて、そのPythonのコンパイラはローカル変数としてそれをマークしたことを意味。したがって、あなたはそれが存在する前にアクセスしています。解くにはnonlocalまたはglobalを使用してください。

1

2つの以前の回答は正しいですが、両方とも少し不明です。私はいくつかの例を紹介します:

あなたが表示されたコードが正常に動作します:

>>> gCharlie = "Global!" 
>>> 
>>> def foo(): 
...  print(gCharlie) 
... 
>>> foo() 
Global! 
>>> print(gCharlie) 
Global! 

は、だからそれはまったく問題ではありません。ただし、関数内グローバル変数を割り当てることができません:

ご覧のとおり
>>> gCharlie = "Global!" 
>>> def foo(): 
...  gCharlie = "Local!" 
...  print(gCharlie) 
... 
>>> foo() 
Local! 
>>> print(gCharlie) 
Global! 

、グローバル変数gCharlieが変化しませんでした。これは、同じ名前の新しいローカル変数を作成したため、変更していないためです。これがエラーの原因です。

>>> gCharlie = "Global!" 
>>> def foo(): 
...  oldCharlie = gCharlie 
...  gCharlie = "Local!" 
...  print(gCharlie) 
... 
>>> foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo 
UnboundLocalError: local variable 'gCharlie' referenced before assignment 

ヒントはエラーです。それはローカル変数gCharlieと言います。この問題はグローバルなgCharlieにアクセスできないことではなく、ローカルなものがまだ作成されていないことです。

ローカル変数を作成するのではなく、グローバル変数を変更することを指定します。これはglobalキーワードで行います。

>>> gCharlie = "Global!" 
>>> def foo(): 
...  global gCharlie 
...  oldCharlie = gCharlie 
...  gCharlie = "Local!" 
...  print(gCharlie) 
... 
>>> foo() 
Local! 
>>> print(gCharlie) 
Local! 

ご覧のとおり、グローバル変数を変更しました。

つまり、グローバル変数は通常は悪い考えです。それらを避けてください。パラメータとして変数を渡すようにしてください。

関連する問題