设为首页收藏本站
查看: 74|回复: 0

[PHP] 关于nonlocal和global的详细解析

[复制链接]

论坛元老

Rank: 6Rank: 6

积分
34268
主题
17031
UID
1347
M币
67
贡献
17170

  • 发表于 2017-5-14 02:44:00 | 显示全部楼层 |阅读模式
    这篇文章主要给大家介绍了关于Python中关键字nonlocal和global的声明与解析的相关资料,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    一、Python中global与nonlocal 声明
    如下代码
    a = 10 def foo(): a = 100执行foo() 结果 a 还是10
    函数中对变量的赋值,变量始终绑定到该函数的局部命名空间,使用global 语句可以改变这种行为。
    >>> a 10 >>> def foo(): ... global a ... a = 100 ... >>> a 10 >>> foo() >>> a 100解析名称时首先检查局部作用域,然后由内而外一层层检查外部嵌套函数定义的作用域,如找不到搜索全局命令空间和内置命名空间。
    尽管可以层层向外(上)查找变量,但是! ..python2 只支持最里层作用域(局部变量)和全局命令空间(gloabl),也就是说内部函数不能给定义在外部函数中的局部变量重新赋值,比如下面代码是不起作用的
    def countdown(start): n = start def decrement(): n -= 1python2 中,解决方法可以是是把修改值放到列表或字典中,python3 中,可以使用nonlocal 声明完成修改
    def countdown(start): n = start def decrement(): nonlocal n n -= 1二、Python nonlocal 与 global 关键字解析
    nonlocal
    首先,要明确 nonlocal 关键字是定义在闭包里面的。请看以下代码:
    x = 0 def outer(): x = 1 def inner(): x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x)结果
    # inner: 2 # outer: 1 # global: 0现在,在闭包里面加入nonlocal关键字进行声明:
    x = 0 def outer(): x = 1 def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x)结果
    # inner: 2 # outer: 2 # global: 0看到区别了么?这是一个函数里面再嵌套了一个函数。当使用 nonlocal 时,就声明了该变量不只在嵌套函数inner()里面
    才有效, 而是在整个大函数里面都有效。
    global
    还是一样,看一个例子:
    x = 0 def outer(): x = 1 def inner(): global x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x)结果
    # inner: 2 # outer: 1 # global: 2global 是对整个环境下的变量起作用,而不是对函数类的变量起作用。
    总结
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在我站开通SVIP可同时获得17个站点VIP资源 立即登录 立即注册
    快速回复 返回顶部 返回列表