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时间与随机数相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • 利用Python实现Shp格式向GeoJSON的转换方法

    利用Python实现Shp格式向GeoJSON的转换方法

    JSON(JavaScript Object Nonation)是利用键值对+嵌套来表示数据的一种格式,以其轻量、易解析的优点,这篇文章主要介绍了利用Python实现Shp格式向GeoJSON的转换,需要的朋友可以参考下
    2019-07-07
  • Python之循环结构

    Python之循环结构

    今天小编就为大家分享一篇关于Python之循环结构,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Python获取excel的数据并绘制箱型图和直方图的方法实例

    Python获取excel的数据并绘制箱型图和直方图的方法实例

    这篇文章主要给大家介绍了关于Python获取excel的数据并绘制箱型图和直方图的相关资料,好的图表能帮助我们深化数据的记忆点,文中通过图文以及代码示例将实现的方法介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 基于Python编写PDF转EPUB以及MOBI工具

    基于Python编写PDF转EPUB以及MOBI工具

    当我们需要在电子阅读器上阅读这些文档时,转换为EPUB或MOBI格式会提供更好的阅读体验,所以本文将使用Python编写一个PDF转EPUB以及MOBI工具,需要的可以参考下
    2025-03-03
  • Python中分数的相关使用教程

    Python中分数的相关使用教程

    这篇文章主要介绍了Python中分数的相关使用教程,主要涉及分数的计算、约分等简单操作,是Python学习过程当中的基础,需要的朋友可以参考下
    2015-03-03
  • Python读写TOML文件的示例代码

    Python读写TOML文件的示例代码

    TOML 文件表示(Tom's Obvious,最小语言),它的语法主要由键=值对组成,本文主要为大家详细介绍了如何使用Python读写TOML文件,感兴趣的小伙伴可以了解下
    2023-08-08
  • Python下载网易云歌单歌曲的示例代码

    Python下载网易云歌单歌曲的示例代码

    这篇文章主要介绍了Python下载网易云歌单歌曲的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python生态圈图像格式转换问题(推荐)

    Python生态圈图像格式转换问题(推荐)

    在Python生态圈里,最常用的图像库是PIL——尽管已经被后来的pillow取代,但因为pillow的API几乎完全继承了PIL,所以大家还是约定俗成地称其为PIL。这篇文章主要介绍了Python生态圈图像格式转换问题,需要的朋友可以参考下
    2019-12-12
  • Python实现随机生成图片验证码详解

    Python实现随机生成图片验证码详解

    这篇文章主要介绍了如何利用Python生成随机的图片验证码 并打印验证码的值,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起试试
    2022-01-01

最新评论