资讯专栏INFORMATION COLUMN

Python闭包局部变量问题

Aldous / 1894人阅读

摘要:最近开始学习,一直觉得定义变量前没有命令很难受,果然今天在练习闭包时遇到了这个问题。

最近开始学习python,一直觉得python定义变量前没有命令很难受,果然今天在练习闭包时遇到了这个问题。先看看出问题的代码

def createCounter():
    n = 0
    def counter():
        n = n + 1 
        return n
    return counter

这里会报错:UnboundLocalError: local variable "n" referenced before assignment

原因:n = n + 1 这行代码导致的歧义

理解为新定义的变量n,并且n = n + 1,由于之前n未被定义,所以会报错

解决方法:用global命令或者nonlocal命令

我喜欢用nonlocal命令,因为global命令会导致全局变量臃肿,修改后代码如下

def createCounter():
    n = 0
    def counter():
        nonlocal n
        n = n+1
        return n
    return counter

这样子就不会报错了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41998.html

相关文章

  • Python 的命名空间

    摘要:真正管理这些名子的事物就是本文的主角命名空间。闭包命名空间闭包函数的名称空间引入。函数调用时产生新的局部命名空间函数返回结果抛出异常时释放命名空间,每一次递归都生成一个命名空间。标识符产生地点决定标识符所处的命名空间。 懒得扫全文的童鞋,可以直接跳到最后看总结。我们先从一个简单的栗子说起: 栗子 a 文件中有变量 va 以及类 A,b 文件导入 a 中class A ,并打印出 A: ...

    ralap 评论0 收藏0
  • PyTips 0x04 - Python 闭包与作用域

    摘要:项目地址闭包在计算机科学中,闭包英语,又称词法闭包或函数闭包,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。 项目地址:https://git.io/pytips 闭包(Closure) 在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是...

    leejan97 评论0 收藏0
  • Python学习之路26-函数装饰器和闭包

    摘要:初步认识装饰器函数装饰器用于在源代码中标记函数,以某种方式增强函数的行为。函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。只有涉及嵌套函数时才有闭包问题。如果想保留函数原本的属性,可以使用标准库中的装饰器。 《流畅的Python》笔记本篇将从最简单的装饰器开始,逐渐深入到闭包的概念,然后实现参数化装饰器,最后介绍标准库中常用的装饰器。 1. 初步认识装饰器 函数装饰...

    sunny5541 评论0 收藏0
  • python基础知识之函数初阶——闭包

    摘要:我们说触发了闭包的函数叫做闭包函数闭包最大的特点就是它可以被外层函数返回后赋值给一个变量,并且携带了外层函数内定义的变量例子如下变量为函数开辟的局部命名空间内定义的变量函数内引用了变量的内层函数名被当作返回值,此时闭包规则达成。 什么是闭包? 其实我们在使用函数过程中不经意间就会触发闭包,因为总会出于某种原因会在函数内引用或修改上一层函数的变量,这时就会触发闭包 那么什么是闭包?其实就...

    TIGERB 评论0 收藏0
  • 流畅的python读书笔记-第七章-函数装饰器和闭包

    摘要:函数装饰器和闭包严格来说,装饰器只是语法糖。何时执行装饰器它们在被装饰的函数定义之后立即运行。装饰器突出了被装饰的函数的作用,还便于临时禁用某个促销策略只需把装饰器注释掉。 函数装饰器和闭包 严格来说,装饰器只是语法糖。如前所示,装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。有时,这样做更方便,尤其是做元编程(在运行时改变程序的行为)时。 Python何时执行装饰器 它们在...

    Hydrogen 评论0 收藏0

发表评论

0条评论

Aldous

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<