2016-03-26 2 views
-3

Я хочу использовать переменную num_samples, которую я определил в функции make_averaged. Когда я использую переменную в fun_averaged, она должна искать ее в рамках своей функции upper level.Использование переменной функции верхнего уровня

def make_averaged(fn, num_samples=1000): 
    def fun_averaged(*args) : 
     totalave = 0 
     savenum = num_samples 
     while not num_samples == 0: 
      totalave = fn(*args) + totalave 
      num_samples -= 1 
     avetagevalue = totalave/savenum 
     return avetagevalue 
    return fun_averaged 

Однако я получаю сообщение об ошибке

while not samples1 == 0: 
UnboundLocalError: local variable 'samples1' referenced before assignment 
+0

Не проще ли было бы здесь только одной функции? –

+1

Ошибка, похоже, не произошла в показанном коде. –

+1

Итак, где вы определяете 'samples1'? – timgeb

ответ

0

Изменение:

while not num_samples == 0: 
    totalave = fn(*args) + totalave 
    num_samples -= 1 

в:

for _ in range(num_samples): 
    totalave = fn(*args) + totalave 

должно помочь. Вы можете получить доступ к num_samples из внешней функции, но вы не можете назначить ей +=.

я не рекомендовать его для этого случая, но в Python 3 вы можете использовать nonlocal для фактической делать то, что вы собираетесь:

nonlocal num_samples 
while not num_samples == 0: 
    totalave = fn(*args) + totalave 
    num_samples -= 1 

Он работает для первого вызова fun_averaged. Но при следующем вызове fun_averaged значение num_samples будет 0.

+0

Мне нужно использовать внешнюю функцию? Я думал, что «fun_averaged (* args)» будет искать значение «num_samples» в «make_averaged», потому что он живет внутри «make_averaged» – Alex

+0

Он может видеть и использовать его, но он не может быть назначен ему. Как только вы используете '+ =', он считает «num_samples» локальной переменной. –

+0

Спасибо вам большое! – Alex

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