何时使用非本地关键字?

问题描述

我不明白为什么我可以在这里使用系列变量:

def calculate_mean():
    series = []
    def mean(new_value):
        series.append(new_value)    
        total = sum(series)
        return total/len(series)
    return mean

但我不能在这里使用 count 和 total 变量(赋值前引用的变量):

def calculate_mean():
    count = 0
    total = 0
    def mean(value):
        count += 1
        total += value
        return total/count
    return mean

只有当我使用这样的非本地关键字时才有效:

def calculate_mean():
    count = 0
    total = 0
    def mean(value):
        nonlocal count,total
        count += 1
        total += value
        return total/count
    return mean

这就是我如何使用calculate_mean()

mean  = calculate_mean()
print(mean(5))
print(mean(6))
print(mean(7))
print(mean(8))

解决方法

您面临的情况是,在一种情况下,您在变量中有一个可变对象,并且您对该对象进行操作(当它是一个列表时) - 而在另一种情况下,您正在对一个不可变对象进行操作,并且使用赋值运算符(增强赋值+=)。

默认情况下,Python 定位所有 读取 的非局部变量,然后相应地使用 - 但如果在内部范围内分配了一个变量,Python 假定它是一个局部变量(即局部变量)到内部函数),除非它明确声明为非本地。