资讯专栏INFORMATION COLUMN

python中的global和nonlocal

gyl_coder / 2474人阅读

摘要:声明这篇文章很大程度上借鉴了。作用域仅限于函数中,从函数外是访问不到的。变量在源文件中非函数或类声明的变量默认是变量。正确的做法应该是变量是引入的,只能用于嵌套函数中。在嵌套函数中使用声明变量,可以修改外层函数中的变量。

声明: 这篇文章很大程度上借鉴了Global, Local and nonlocal Variables。
local变量

与其它的编程语言相同,在函数中声明的变量都是local变量。作用域仅限于函数中,从函数外是访问不到的。

In [1]: def f():
            s = "local val"
            print("read s from interval:", s)

In [2]: print(s)
NameError: name "s" is not defined

In [3]: f()
read s from interval: local val
global变量

在源文件中(非函数或类)声明的变量默认是global变量。

在函数中可以随意读取global变量,这一点不多说,不管是函数声明在前,还是global变量声明在前

涉及到修改global变量的时候,要特别注意了: 如果在函数体中未使用global声明这个变量,那么函数体中修改的是local变量的值,global变量并未更新。

In [4]: s = "global val"

In [6]: def f():
   ...:     s = "change global val"
   ...:     print("change global val", s)
   ...:     

In [7]: f()
change global val change global val

In [8]: s
Out[8]: "global val"

正确的做法应该是:

In [4]: s = "global val"

In [6]: def f():
   ...:     global s
   ...:     s = "change global val"
   ...:     print("change global val", s)
   ...:     

In [7]: f()
change global val change global val

In [8]: s
Out[8]: "change global val change global val"
nonlocal变量

nonlocalpython3引入的,只能用于嵌套函数中。在嵌套函数中使用nonlocal声明变量,可以修改外层函数中的变量。

In [11]: def outer():
    ...:     s = "outer val"
    ...:     def inner():
    ...:         nonlocal s
    ...:         s = "inner val"
    ...:         print("change outer s",s)
    ...:     print("before inner(), s=", s)
    ...:     inner()
    ...:     print("after inner(), s=", s)
    ...:     

In [12]: outer()
before inner(), s= outer val
change outer s inner val
after inner(), s= inner val

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

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

相关文章

  • Python3 关键字nonlocalglobal的用法与区别

    摘要:关键字在中,闭包只能读外部函数的变量,而不能改写它。注意关键字是中出现的所以在中无法直接使用关键字里只有种作用域全局作用域和局部作用域。两者使用的范围不同。 关键字nonlocal 在Python 2.x中,闭包只能读外部函数的变量,而不能改写它。为了解决这个问题,Python 3.x引入了nonlocal关键字,在闭包内用nonlocal声明变量,就可以让解释器在外层函数中查找变量名...

    PumpkinDylan 评论0 收藏0
  • python基础教程:作用域命名空间

    摘要:正如我们前面举的张三的例子那样,不同命名空间中的名称之间没有任何关系。作用域作用域,是一个命名空间可直接发放完的代码的文本区域。删除也是如此,语句会从局部命名空间的引用中移除对的绑定。 命名空间和作用域的概念我们之前也提到过,比如内置函数globals(),函数中变量的作用域,模块使用的import等等。这些可能让我们对这两个概念有了大致的理解。本节再详细探讨一下。 showImg(h...

    wangzy2019 评论0 收藏0
  • 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开发第四篇--函数

    摘要:第一种情况打印结果为第二种打印结果为因为如果默认参数是一个可变的数据类型,那么他在内存中永远是一个。 名称空间与作用域 1.变量储存在一个内存空间中 2.当程序运行的时候代码从上到下依次执行,它会将变量与值的关系存储在一个空间中,这个空间叫名称空间,命名空间,全局名称空间 3.当程序遇到函数时,它会将函数名存在内存中,函数体漠不关心 4.当程序执行的时候,内存会临时开辟一个空间,...

    lemanli 评论0 收藏0

发表评论

0条评论

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