2016-05-06 7 views
0

私はPythonでプログラムを持っています。プログラムの一部は次のとおりです。私はそれの機能を作りたい、さらにプログラミングのためPython:少しグローバルな理解

suggestengines = get_suggestengines(suggestengines) 
sleeptimer = sleepcount * len(suggestengines) 
seeds = get_seeds(dummydata=False) 

def first_step(): 
    suggestengines = get_suggestengines(suggestengines) 
    sleeptimer = sleepcount * len(suggestengines) 
    seeds = get_seeds(dummydata=False) 

今、私は私がget_suggestengines(に渡したい「suggestengines」)のためにエラーが出ます。また、スリープタイマーとシードは、残りのプログラムでは使用しないというマーカーを取得します。私はそれをgoogledと答え:私たちグローバル。だから私はそこに私が

for seed in tqdm(seeds, leave=True): 

を持っているプログラムの別の部分では、すべて

def first_step(): 
    global suggestengines 
    global sleeptimer 
    global seeds 
    suggestengines = get_suggestengines(suggestengines) #which engines to run? 
    sleeptimer = sleepcount * len(suggestengines) 
    seeds = get_seeds(dummydata=False) 

のグローバル追加したプログラムは私にtqdmでエラーVORの種を与えます。私がそれを変えても、それを変えると、次のようになります。

def partTwo(): 
    for seed in tqdm(seeds, leave=True): 

それでは、私はグローバルを使用しませんでしたが、もうエラーはありません。なぜ誰かが私に説明して、パート2でもグローバルを使う必要があるのですか?

+0

エラーに関する詳細情報を掲載してください。 – lesingerouge

+0

私はプログラムを開始しようとしませんでした。ちょうどPyCharmが赤い単語に下線を引いています。 – TomHere

答えて

2

声明

global <identifier> 

の割り当てに使用された場合<identifier>がグローバルに参照すべきであるというのpythonを伝えます。変数を宣言して既存の変数に代入するのに構文上の違いがないため、これはグローバルを変更する関数では必要です。 Pythonのデフォルトでは、グローバル状態を変更するのではなく、関数内の代入で新しい変数を作成します。

変数を読み込んだだけでは構文的なあいまいさがないので、Pythonは変数を見つけて使用します(ローカルの変数がない場合はグローバル)。

例:

a = 1 

def foo(): 
    a = 2 # this will create a new, local variable a 

def bar(): 
    global a # "when I refer to a, I mean the global one" 
    a = 2 # this will change the global variable a 

指定された名前を持つグローバルが存在しない場合は、global文自体は新しいグローバル変数が、任意の以下の割り当てを作成しませんでしょう。例えば。所与次y(); z()1を印刷しながら

def x(): 
    global c 

def y(): 
    global c 
    c = 1 

def z() 
    print c 

x(); z()は、エラー(定義されていないグローバル名「C」)であろう。

2

seedsはまだ初期化されていません。その初期化はまだ呼び出されていないdefの一部であるためです。 forループをdefの中に入れると、関数を呼び出す順番で呼び出されるので、実際に使用するまでインタープリタは不平を言うことはありません。

ここで覚えておかなければならないのは、変数を初期化した後に変数を使用することだけです。

+0

私はfirst_step()を呼び出してからpartTwo()を呼び出した場合 partTwo()でグローバルシードを呼び出さずにfirst_stepで初期化したシードをpartTwoで使用できますか? – TomHere

+0

はい。試してみる。 – yelsayed

関連する問題