2016-09-10 7 views
0

私は、Pythonを学習し、それ以前の今日のpythonコンソールでコードのこの部分を走っています:ローカル変数はジェネレータ関数内でアクセスできませんか?

num = 0 

def generator(): 
    while True: 
     yield num 
     num += 1 

for i in generator(): 
    if i > 5: break 
    print(i) 

それは私が再書いたコードと、このバージョン働いUnboundLocalError: local variable 'num' referenced before assignment

投げた:

def generator(): 
    num = 0 
    while True: 
     yield num 
     num += 1 

for i in generator(): 
    if i > 5: break 
    print(i) 

私の質問はこれです:通常の関数でできるように、ジェネレータ関数内でローカル変数を使用できませんか?

+2

'num'は失敗したコードの関数にローカルではありません – UnholySheep

+0

@UnholySheep関数内に' print(num) '関数を定義して' test() 'を呼び出すと、リンクされた質問の受け入れられた答えから0 – Vinayak

+2

@Vinayakを印刷します: "単にグローバル変数にアクセスしたいのであれば、その名前を使うだけですが、その値を変更するにはグローバルキーワードを使う必要があります。 – Mephy

答えて

1

最初のコードでは、numをグローバル変数として使用しようとしています。これは、関数の外で定義されています。

プログラムがnum += 1に達すると、以前に参照したグローバルと同じ名前を持つローカル変数に割り当てを試みます。しかし、numというローカル変数にはまだ値が割り当てられていないので、インクリメントは失敗します。

関数内で大域変数を代入またはインクリメントしたい場合は、global num(通常は関数の先頭にある)で宣言する必要があります。これはジェネレータとは関係なく、通常の機能でも失敗します。

1

UnholySheep has commentedとして、num変数はgenerator()関数内でローカルに定義されていません。

だけのglobalキーワードを使用して、あなたがgenerator()関数内でグローバル名前空間からそれを使用するマーク:

num = 0 

def generator(): 
    global num 
    while True: 
     yield num 
     num += 1 

for i in generator(): 
    if i > 5: break 
    print(i) 

...、すべてが問題ないはずです。

注:問題は、使用しているファンクションのタイプ(yieldを含む)に関連していません。

関連する問題