2011-01-21 5 views
1

myvar1generate()の機能ではアクセスできるが、copy()の機能ではアクセスできない、この単純なPythonスクリプトがあります。pythonスクリプトのエラー

#!/usr/bin/python 

import os, time 

def Test(tcid,descr,iterations,filsz): 

     def setup(): 
       print "entering set up\n" 
       global myvar1, myvar2 

       myvar1 = 1.0 
       myvar2 = os.getcwd() 

     def generate(): 
       print "entering generate\n" 
       print "in generate", myvar1, myvar2 

     def copy(): 

      print "in copy", myvar1, myvar2 
      myvar1 += 5.0 



     setup() 
     generate() 

     for loopcount in range(5): 
      loopcount = loopcount + 1 
      copy() 



if __name__ == "__main__": 
     Test('test','simple test',2,10) 

エラー:

トレースバック(最新の呼び出しの最後): テスト( 'テスト'、」で ファイル "./pyerror.py"、35行を、エラーを考え出す助けが必要単純なテスト '、2,10) ファイル "./pyerror.py"、行30、テスト中 コピー() ファイル "./pyerror.py"、行20、コピー "コピー中"、myvar1 、myvar2 UnboundLocalError:割り当て前に参照されるローカル変数 'myvar1'

+0

[Pythonスコープの問題は、変数に_assigning_するときにのみ問題が発生する可能性があります](http://stackoverflow.com/questions/2886932/python-scope-problems-only-when-assigning-to-a-variable) –

答えて

2

は、あなたが関数内でグローバルを上書きどこglobalを必要としています。 setupmyvar1をグローバルに設定していますが、未設定のローカル変数として使用しています。したがって、「ローカル変数 『myvar1』の割り当ての前に参照さ」

def copy(): 
    global myvar1 
    print "in copy", myvar1, myvar2 
    myvar1 += 5.0 

あなたは、それを捨てることを燃やすと異なるもので始まり、その後、定期的にglobalを用いることが提案されているチュートリアルを読んでいる場合。

2

copy()関数では、myvar1はグローバルとして宣言されていませんが、文myvar1 += 5.0に代入されています。これにより暗黙的にmyvar1がローカル変数になります。関数の最初の行にあるprintステートメントは、myvar1という名前のローカル変数にもアクセスしようとしますが、そのようなローカル変数はまだ存在しません。

ローカル変数は、静的に、つまりコンパイル時に決定されます。 copy()をPythonでコンパイルすると、myvar1は関数本体全体のローカル変数としてマークされます。このエラーをトリガするために最も簡単なコードを見てすることは有益かもしれ:

def f(): 
    print x 
    x = 5 
x = 3 
f()