何时使用 nonlocal 关键字? [复制]

Posted

技术标签:

【中文标题】何时使用 nonlocal 关键字? [复制]【英文标题】:When to use nonlocal keyword? [duplicate] 【发布时间】:2021-09-06 07:05:33 【问题描述】:

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

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

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

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))

【问题讨论】:

我仍然不明白为什么我不必将非本地与系列变量一起使用:( 当你想赋值到局部范围内的非局部变量时,你需要使用nonlocal,这与global完全类似 【参考方案1】:

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

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

【讨论】:

以上是关于何时使用 nonlocal 关键字? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

函数里面的global 和 nonlocal 关键字的使用

nonlocal关键字

Python 关键字之 nonlocal

3.关于作用域知识的额外补充global和nonlocal关键字

python随笔系列--global和nonlocal关键字

python关键字global和nonlocal总结