【问题标题】:Using upper level function's variable [duplicate]使用上层函数的变量
【发布时间】:2016-03-26 20:19:24
【问题描述】:

我想使用我在make_averaged 函数中定义的num_samples 变量。当我在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

【问题讨论】:

标签: python closures


【解决方案1】:

变化:

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

【讨论】:

  • 我必须使用外部函数?我认为“fun_averaged(*args)”会在“make_averaged”中搜索“num_samples”的值,因为它位于“make_averaged”中
  • 它可以看到和使用它,但它不能分配给它。只要您使用+=,它就会认为num_samples 是一个局部变量。
  • 其实也不能用在外层函数里,只能用nonlocal
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2013-05-02
  • 2017-03-06
  • 1970-01-01
  • 2018-01-24
相关资源
最近更新 更多