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报错ValueError: cannot convert float NaN to integer的解决方法

    Python报错ValueError: cannot convert float NaN to intege

    在Python编程中,我们经常需要处理各种数据类型,包括浮点数和整数,然而,有时候我们可能会遇到一些意外的情况,比如将一个包含NaN(Not a Number)的浮点数转换为整数时,就会抛出错误,本文将探讨这个错误的原因,并给出几种可能的解决方案,需要的朋友可以参考下
    2024-09-09
  • Python实现剪刀石头布小游戏(与电脑对战)

    Python实现剪刀石头布小游戏(与电脑对战)

    这篇文章给大家分享Python基础实现与电脑对战的剪刀石头布小游戏,练习if while输入和输出,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-12-12
  • python 实用工具状态机transitions

    python 实用工具状态机transitions

    这篇文章主要介绍了python 实用工具状态机transitions的使用,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-11-11
  • PyQt5实现平滑移动侧边菜单栏效果的示例

    PyQt5实现平滑移动侧边菜单栏效果的示例

    本文主要介绍了PyQt5实现平滑移动侧边菜单栏效果的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • python文件头部声明#coding=utf-8问题

    python文件头部声明#coding=utf-8问题

    这篇文章主要介绍了python文件头部声明#coding=utf-8问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • OpenCV图像处理之七种常用图像几何变换

    OpenCV图像处理之七种常用图像几何变换

    这篇文章主要介绍了OpenCV图像处理中常用的几个图像几何变换:裁剪、放大、缩小、平移、错切、镜像、旋转、透视等。文中示例代码非常详细,需要的朋友可以参考一下
    2021-12-12
  • K最近邻算法(KNN)---sklearn+python实现方式

    K最近邻算法(KNN)---sklearn+python实现方式

    今天小编就为大家分享一篇K最近邻算法(KNN)---sklearn+python实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 关于matlab图像滤波详解(二维傅里叶滤波)

    关于matlab图像滤波详解(二维傅里叶滤波)

    这篇文章主要介绍了关于matlab图像滤波详解(二维傅里叶滤波),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python使用XPath解析HTML的方法详解

    Python使用XPath解析HTML的方法详解

    XPath是一种用于选择XML文档中节点的语言,它可以通过路径表达式来定位节点。本文将介绍Python中使用XPath解析HTML文档的方法和技巧,需要的可以参考下
    2023-05-05
  • python实现简单遗传算法

    python实现简单遗传算法

    这篇文章主要介绍了python如何实现简单遗传算法,帮助大家更好的利用python进行数据分析,感兴趣的朋友可以了解下
    2020-09-09

最新评论