4

在下面的代码中,

def makeAverage():
    series = []
    def average(newValue):
        series.append(newValue)
        total = sum(series)
        return total/len(series)
    return average

python 解释器不series希望nonlocalaverage().

但是在下面的代码中

def makeAverage():
    count = 0
    total = 0
    def average(newValue):
        nonlocal count, total
        count += 1
        total += newValue
        return total/count
    return average

问题:

为什么 python 解释器期望count&在中total声明?nonlocalaverage()

4

1 回答 1

4

如果您在该函数中的任何位置分配给该变量并且您没有以其他方式标记它(使用globalor nonlocal),则该变量被视为函数的本地变量。在您的第一个示例中,没有对seriesinside的赋值average,因此它不被认为是本地的average,因此使用了封闭函数的版本。在第二个示例中,对totalcountinside进行了赋值average,因此需要标记nonlocal它们以从封闭函数中访问它们。(否则你会得到一个 UnboundLocalError 因为average试图在第一次分配给它们之前读取它们的值。)

于 2017-07-17T04:35:43.253 回答