Python 使用上层函数';s变量

Python 使用上层函数';s变量,python,closures,Python,Closures,我想使用我在make\u averaged函数中定义的num\u samples变量。当我在fun\u averaged中使用变量时,它应该在其上层函数的范围内搜索它 def make_averaged(fn, num_samples=1000): def fun_averaged(*args) : totalave = 0 savenum = num_samples while not num_samples == 0:

我想使用我在
make\u averaged
函数中定义的
num\u samples
变量。当我在
fun\u averaged
中使用变量时,它应该在其
上层
函数的范围内搜索它

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
更改:

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

应该有帮助。您可以从外部函数访问
num_samples
,但不能使用
+=
分配给它

我不建议在这种情况下使用它,但在Python 3中,您可以使用它来实际执行您想要执行的操作:

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

它适用于第一次调用
fun\u
。但是下次调用
fun\u averaged
时,
num\u samples
的值将是
0

这里不是只有一个函数更简单吗?显示的代码中似乎没有出现错误。那么您在哪里定义
samples1
?您没有向
fun\u averaged()传递任何参数
。我必须使用外部功能吗?我认为“fun_averaged(*args)”将在“make_averaged”中搜索“num_samples”的值,因为它位于“make_averaged”的内部,它可以看到并使用它,但不能分配给它。只要你使用
+=
它就会认为
num\u samples
是一个局部变量。实际上,它不能在外部函数中使用。我只能使用非局部变量
nonlocal num_samples
while not num_samples == 0:
    totalave = fn(*args) + totalave
    num_samples -= 1