美文网首页
说说 Python 中 nonlocal 的作用

说说 Python 中 nonlocal 的作用

作者: deniro | 来源:发表于2021-02-28 18:40 被阅读0次

    假设我们需要一个函数,用于计算平均值,每次调用这个函数时,都会把传入的入参保存在内部。
    根据要求,这个函数的一种实现方式是使用装饰性函数,其内部使用闭包来存放次数与总量。最后再使用这两个数计算出平均值。

    实现代码为:

    def make_averager():
        count = 0
        total = 0
    
        def averager(new_value):
            count += 1
            total += new_value
            logging.debug('count -> %s',count)
            logging.debug('total -> %s',total)
            return total / count
    
        return averager
    
    
    if __name__ == '__main__':
        avg = make_averager()
        result = avg(10)
        result = avg(11)
        result = avg(12)
        logging.info('result -> %s', result)
    

    运行结果:

    IDE 也提醒我们这里的 count 与 total 变量存在问题:

    因为对于数字、字符串、元组等不可变类型来说,它们只能读取,不能更新。 如果对其更新,比如示例中的 count += 1,就会隐式地创建局部变量 count。这样,count 这个变量就不是自由变量了,所以也就不会被保存在闭包中。

    Python 3 引入了 nonlocal 声明,就是为了解决这一问题。它的作用是把可能引起上述问题的变量标记为自由变量,这样也就可以使用闭包来保存值咯。

    上述代码进行简单修改即可:


    运行结果:



    Luciano Ramalho (作者),安道,吴珂 (译者).流畅的Python[M].人民邮电出版社,2017:316-318.

    相关文章

      网友评论

          本文标题:说说 Python 中 nonlocal 的作用

          本文链接:https://www.haomeiwen.com/subject/cirifltx.html