2012-04-17 11 views
0

私はPythonで初心者です。私は練習のために、以下のようなコードを書いた。..出力は以下のように似ているグローバル変数がPythonのさまざまな関数で動作しないのはなぜですか?

i=1 
def wrte(): 
global i 
while i<5: 
    print "%s .Line..\n" %i 
    i+=1 

def appnd(): 
    j=i 
    while i in range(i,j+3): 
    print "%s .Line..\n" %i 
    i+=1 

def Main(): 
    wrte() 
    appnd() 

Main() 

それを見てください

1 .Line.. 

    2 .Line.. 

    3 .Line.. 

    4 .Line.. 

**Traceback (most recent call last): 
    Line 18, in <module> 
    Main() 
    Line 16, in Main 
    appnd() 
    Line 9, in appnd 
    j=i 
UnboundLocalError: local variable 'i' referenced before assignment** 

期待される結果::次のシーケンスは

のように追加する必要がありますされます
5. Line.. 
6. Line.. 
7. Line.. 

この上で私を助けてください..

+3

それはそれを動作させるためにwrte'、あなたはその中でやっていることを考える 'で正しいです... –

答えて

3

あなたは電子でglobal定義を必要としますその変数を使用するach関数です。

def appnd(): 
    global i 

注:可能であれば、グローバル変数および関連する関数をクラスに移動します。

0

j=i 

global i 

を追加すると、あなたの定義の範囲が局所的である問題に

+0

はい、これは動作します! すべての関数はグローバル変数を使用することを明示的に知らせるために "global"キーワードを必要とします。 – pk10

0

を解決する必要があります。関数内で変数をグローバルとして宣言しても、その関数がすべての関数に適用されるわけではありません。あなたはappnd()関数でもiをグローバルとして宣言しなければなりません。 あなたのスタイルが正しいことを意味するわけではありません。あなたはむしろ関数に変数を渡すでしょう。

0

次の定義は動作します:

def appnd(): 
    j=i 
    while i in range(i,j+3): 
    print "%s .Line..\n" %i 

# it would print infinitely, but will work 

Pythonは変数がそれらを探すために範囲を定義するための関数で使用されている方法を見てコンパイル時に。 appndの定義では、iの割り当てがローカル変数として脅かそうとしています。私のコードでは代入がないので、Pythonは親スコープからiの値を取得します。この場合、iはローカルでもグローバルでもなく、というフリー変数と呼ばれます。 Execution model - Scopes and Binding - お勧めします。

0

グローバルを使用する必要があるときはいつも知っています。そうでなければ、あなたの書き込み機能にはなりません。あなたがあなたのappend関数で欲しいと思う変数だけを読むなら、それを省略することができますが、あなたはi + = 1を持っていますので、あなたはそれを変更します。ただ、やって追加変更:

for line in range(i, i + 3): 
    print "%s .Line..\n" % line 
関連する問題