python nonlocal的用法详解

 更新时间:2023年10月26日 09:50:14   作者:Zack1st_diu  
这篇文章主要给大家介绍了关于python nonlocal用法的相关资料,最近在python学习中遇到了nonlocal关键字但是感到困惑,于是记录nonlocal关键字用法,需要的朋友可以参考下

官网的nonlocal的用法

1,非局部声明变量指代的已有标识符是最近外面函数的已声明变量,但是不包括全局变量。这个是很重要的,因为绑定的默认行为是首先搜索本地命名空间。nonlocal声明的变量只对局部起作用,离开封装函数,那么该变量就无效。

2,非局部声明不像全局声明,我们必须在封装函数前面事先声明该变量

3,非局部声明不能与局部范围的声明冲突

第一点:

count = 1 # 这里是声明的是全局变量,对于nonlocal来说全局变量是不包括的

def a():
    count = 'a函数里面' # 这里对于nonlocal来说就是外面的函数已声明的变量
    def b():
        nonlocal count # nonlocal count指的是函数b内
        print(count)
        count = 2
    b()
    print(count)

if __name__ == '__main__':
    a()
    print(count)
count = 1

def a():
    # count = 'a函数里面' # SyntaxError: no binding for nonlocal 'count' found
    def b():
        nonlocal count
        print(count)
        count = 2
    b()
    print(count)

if __name__ == '__main__':
    a()
    print(count)

像上面的代码,如果nonlocal执行前,没有在局部里先声明局部变量,就会报错找不到局部变量,因为nonlocal是不会查全局变量。

nonlocal的作用:

1,nonlocal可以让最里面的函数使用最近的一个外函数已声明的变量,将最里面的函数的局部变量设置和最近的一个外函数声明的变量为同一个变量(引用同一个内存地址)。例如下面的代码,c函数声明了nonlocal count,那么c函数就可以用最近函数b声明的count=2,并且可以对b.count赋值。(注意:nonlocal不会使用全局变量)

count = 1

def a():
    count = 'a函数里面'
    def b():
        count = 2
        print(count)
        def c():
            nonlocal count
            print(count)
        c()
    b()
    print(count)

if __name__ == '__main__':
    a()
    print(count)

2
2
a函数里面
1

案例:引用官网的例子对global,nonlocal,全局变量的关系解释

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

上面案例代码看出:

1,do_local函数下定义的局部变量spam不会改变scope_test函数定义的局部变量spam。
2,do_nonlocal函数下nonlocal非本地声明,将do_nonlocal函数下的局部变量spam声明为非do_nonlocal函数本地,而是将do_nonlocal.spam声明和scope_test.spam为同一个变量。
3,do_global函数下global全局声明spam为全局变量,但是依然不会改变scope_test.spam的局部变量,说明global全局声明对局部的变量不产生作用。
4,在全局引用全局声明global的全局变量spam是可以的。

总结 

到此这篇关于python nonlocal用法详解的文章就介绍到这了,更多相关python nonlocal用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现简单截取中文字符串的方法

    Python实现简单截取中文字符串的方法

    这篇文章主要介绍了Python实现简单截取中文字符串的方法,涉及Python字符串截取与编码转换的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 通过Python中的http.server搭建文件上传下载服务功能

    通过Python中的http.server搭建文件上传下载服务功能

    通过本文我们学习了如何使用Python的http.server模块搭建一个基本的HTTP服务器,并实现文件下载服务,介绍了如何设置服务器端口、自定义文件目录、定制HTTP响应头以及处理GET请求,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • pycharm打包python项目为exe执行文件的实例代码

    pycharm打包python项目为exe执行文件的实例代码

    这篇文章主要介绍了pycharm打包python项目为exe执行文件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 使用Django Form解决表单数据无法动态刷新的两种方法

    使用Django Form解决表单数据无法动态刷新的两种方法

    这篇文章主要介绍了使用Django Form解决表单数据无法动态刷新的两种方法,需要的朋友可以参考下
    2017-07-07
  • Pygame框架实现飞机大战

    Pygame框架实现飞机大战

    这篇文章主要为大家详细介绍了Pygame框架实现飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Python3生成手写体数字方法

    Python3生成手写体数字方法

    本篇文章给大家分享习如何Python3生成手写体数字方法以及实例代码分享,有兴趣的朋友参考下吧。
    2018-01-01
  • 教你如何在Django 1.6中正确使用 Signal

    教你如何在Django 1.6中正确使用 Signal

    因为新的django开发人员得知signal之后, 往往会很高兴去使用它. 他们在能使用signal的地方就使用signal, 并且这是他们觉得自己是django专家一样. 然而, 像这样编码一段时间后, django项目就会变得异常复杂, 许多内容都纠结在一起无法解开.
    2014-06-06
  • python对绑定事件的鼠标、按键的判断实例

    python对绑定事件的鼠标、按键的判断实例

    今天小编就为大家分享一篇python对绑定事件的鼠标、按键的判断实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • PyCharm取消波浪线、下划线和中划线的实现

    PyCharm取消波浪线、下划线和中划线的实现

    这篇文章主要介绍了PyCharm取消波浪线、下划线和中划线的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 浅谈Python2获取中文文件名的编码问题

    浅谈Python2获取中文文件名的编码问题

    下面小编就为大家分享一篇浅谈Python2获取中文文件名的编码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01

最新评论