2016-09-10 3 views
0

Я учусь на 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

I переписали код и эта версия работала:

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, если я определяю функцию' test() 'с' print (num) 'внутри нее и вызывается' test() 'в консоли, он печатает 0. – Vinayak

+2

@ Винайак из принятого ответа связанного вопроса: «Если вы хотите просто получить доступ к глобальной переменной, вы просто используете ее имя. Однако для изменения ее значения вам нужно использовать глобальное ключевое слово». – Mephy

ответ

1

В первом коде вы пытаетесь использовать num как глобальную переменную: она определяется вне функции.

Когда программа достигает num += 1, вы затем пытаетесь назначить локальную переменную, которая имеет то же имя, что и глобальное, на которое вы ссылались ранее. Но поскольку локальной переменной с именем num еще не присвоено значение, приращение не выполняется.

Если вы хотите назначить или увеличить глобальную переменную внутри функции, ее необходимо объявить с помощью global num (как правило, в начале функции). Это не имеет ничего общего с генераторами, это также не подходит для обычных функций.

1

В качестве UnholySheep has commented переменная num не определена локально внутри функции generator().

Просто знак, что вы используете его из глобального пространства имен внутри функции generator(), используя ключевое слово global:

num = 0 

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

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

... и все должно быть хорошо.

Примечание: Проблема не связана с типом функции (генератор, включая yield), который вы используете.

Смежные вопросы