python2 nonlocal_python关键字及用法

python2 nonlocal_python关键字及用法python变量引用顺序:从当前作用域开始寻找变量,如果没找到就往上一层作用域寻找,没找到就再上一层……即:当前作用域局部变量->外层作用域变量->再外层作用域变量->……->当前模块全局变量->pyhton内置变量global:全局变量nonlocal:外层嵌套函数的变量使用总结:局部作用域改变全局变量用global,global同时还可以定义新的…


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

python变量引用顺序:从当前作用域开始寻找变量,如果没找到就往上一层作用域寻找,没找到就再上一层……

即:当前作用域局部变量->外层作用域变量->再外层作用域变量->……->当前模块全局变量->pyhton内置变量

global:全局变量

nonlocal:外层嵌套函数的变量

使用总结:

1、局部作用域改变全局变量用global, global同时还可以定义新的全局变量

2、内层函数改变外层函数变量用nonlocal, nonlocal不能定义新的外层函数变量,只能改变已有的外层函数变量

     同时nonlocal不能改变全局变量

一、没有关键字

a = 10  # a1 当前模块全局变量
def outer():
    a = 9  # a2 当前outter作用域局部变量
    def inner():
        a = 8  # a3 当前inner作用域局部变量
        print(a)  # a3 8, 在inner的局部作用域中找到了a3
    inner()  # inner()函数结束,a3作为inner局部变量被释放
    print(a)  # a2 9,在outer局部作用域中找到a2
outer()  # outer()函数结束,a2作为outer局部变量被释放
print(a)  # a1 10, 在当前模块全局作用域中找到了a1

a1、a2、a3分别是不同变量

二、global关键字:声明此变量为全局变量

1、用于在局部作用域中修改全局变量

a = 10  # a1 当前模块全局变量
def outer():
    a = 9  # a2 当前outter作用域局部变量
    def inner():
        global a
        a = 8  # a3 既是全局变量a1,又是inner局部变量
        print(a)  # a3 8,在inner的局部作用域中找到了a3
    inner()  # inner()函数结束,a3作为全局变量被保留下来成为a1
    print(a)  # a2 9,在outer局部作用域中找到a2
outer()  # outer()函数结束,a2作为outer局部变量被释放
print(a)  # a1 8, 在当前模块全局作用域中找到了a1

a1、a3是同一个变量,都是全局变量a

2、若没有在外部定义全局变量a,在局部作用域中加global关键字依然能声明一个变量为全局变量

def outer():
    a = 9  # a2 当前outter作用域局部变量
    def inner():
        global a
        a = 8  # a3  既是inner局部变量,又是模块全局变量
        print(a)  # a3 8 在inner的局部作用域中找到了a3
    inner()  # inner()函数结束,a3作为全局变量被保留下来
    print(a)  # a2 9,在outer局部作用域中找到a2
outer()  # outer()函数结束,a2作为outer局部变量被释放
print(a)  # a3 8在当前模块全局作用域中找到了a3

3、outer()没有局部变量a,则往上使用全局变量a

def outer():
    def inner():
        global a
        a = 8  # a3  既是inner局部变量,又是模块全局变量
        print(a)  # a3 8,在inner的局部作用域中找到了a3
    inner()  # inner()函数结束,a3作为inner局部变量被释放
    print(a)  # a3 8,在outer局部作用域中没找到a,往上在全局作用域中找到了全局变量a3
outer()  # outer()函数结束,a2作为outer局部变量被释放
print(a)  # a3 8,在当前模块全局作用域中找到了a3

三、nonlocal关键字:声明此变量与外层同名变量为相同变量

1、用于在内层函数中改变外层函数变量

a = 10  # a1 当前模块全局变量
def outer():
    a = 9 # a2 outer局部变量
    def inner():
        nonlocal a
        a = 8  # a3  既是inner局部变量,又是外层outer局部变量
        print(a)  # a3 8,在inner的局部作用域中找到了a3
    inner()  # inner()函数结束,a3作为外层变量(outer局部变量)被保留成为a2
    print(a)  # a2 8,在outer局部作用域中找到a2(在inner中被改变)
outer()  # outer()函数结束,a2作为outer局部变量被释放
print(a)  # a1 10,在当前模块全局作用域中找到了a1

a2、a3为同一变量

2、注意:如果在外层没有找到变量a,则会继续在再外层寻找,直到全局作用域的下一层为止(看第3点)

a = 10  # a1 当前模块全局变量
def outer2():
    a = 9 # a2 outer2作用域局部变量
    print(a) # a2 9,还未被a3改变
    def outer1():
        print(a) # a2 9,在outer1中没找到局部变量a,则寻找外层(outer2)变量a2(还未被a3改变)
        def inner():
            nonlocal a
            a = 0  # a3 既是inner局部变量,又是再外层outer2作用域变量
            print(a)  # a3 0, 找到inner局部变量a3
        inner()  # inner()函数结束,a3作为外层变量(outer2局部变量)被保留成为a2
        print(a)  # a2 0,在outer1中没找到局部变量a,则寻找外层(outer2)变量a2(被a3改变)
    outer1()
    print(a) # a2 0, 在outer1中找到outer1局部变量a2(被a3改变)
outer2() 
print(a)  # a1 10,在当前模块全局作用域中找到了a1

3、全局变量不是外层变量,不被nonlocal寻找

a = 10  # a1 当前模块全局变量
def outer():
    def inner():
        nonlocal a  # 在当前作用域外层即outer局部作用域中没找到outer局部变量a,outer外层为全局作用域,nonlocal不继续寻找,报错
        a = 8
        print(a)
    inner()
    print(a)
outer() 
print(a)  # a1 10,在当前模块全局作用域中找到了a1

报错:

python2 nonlocal_python关键字及用法

a = 10  # a1 当前模块全局变量
def outer2():
    nonlocal a  # outer2下一层为全局作用域,nonlocal不寻找全局变量,报错 
    a = 8
outer2() 
print(a)  # a1 10,在当前模块全局作用域中找到了a1

python2 nonlocal_python关键字及用法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196694.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 智能的概念定义_实践的本质和结构

    智能的概念定义_实践的本质和结构本文描述了我理解的智能的DIKW结构(数据层Data->信息层Information->知识层Knowledge->智慧层Wisdom),希望凭借这个框架解释智能的来源和本质。

    2022年11月1日
  • html5 移动端单页面,html5 移动端单页面布局「建议收藏」

    html5 移动端单页面,html5 移动端单页面布局「建议收藏」移动端的web网页使用的是响应式设计,但一般我们看到的网站页面都是跳转刷新得到的,比如通过点击一个menu后进入到另一个页面今天来说下是移动端的单页面的布局。单页面就是一切操作和布局都是在一个页面下进行不需要页面跳转,再通俗的说就是类似于平常的选项卡但是他又比选项卡要复杂一点因为他是在手机端并且当做是一个页面单页面的作用以及优势:1.嵌套到native里实现app的混合开发2.数据量小的页…

    2022年6月21日
  • javascript如何定义类

    javascript如何定义类

    2021年8月5日
  • 蓝牙脂肪秤模块测量原理

    蓝牙脂肪秤模块原理跟普通电子体重秤的原理差不多,都是利用压力传感器及芯片设计完成功能的实现。蓝牙电子秤的外形和地面有四个接触点,四个接触点那里都放着一种压力传感器,压力传感器将人体的重量转换成电信号,后经过芯片设计完成处理器AD采样,再经过换算便可以得到人体的体重。蓝牙脂肪秤模块测量体脂是通过电阻抗法测量出来的,它的具体原理是由电极片发出微弱电流,与人体形成一个闭环,通过肌肉易导电,脂肪不导电的…

    2022年4月11日
  • SpringApplication.run(MyApplication.class, args)运行流程源码分析[通俗易懂]

    SpringApplication.run(MyApplication.class, args)运行流程源码分析[通俗易懂]SpringApplication.run(MyApplication.class,args);如何启动springBoot项目的run()一个静态的辅助方法,可以使用默认设置和用户提供的参数从指定源运行SpringApplicationConfigurableApplicationContext大多数应用程序上下文(如果不是全部的话)将实现SPI(服务提供者)接口。除了Applicat…

    2022年9月9日
  • teleport怎么用_telelist怎么用

    teleport怎么用_telelist怎么用teleport使用说明浏览器下载网页:只能浏览主页和少数网页,其它不能浏览,容量几百kbteleport下载项目一能完全离线看网页,7328多文件9个JPG文件,大小134Mteleport下载项目二部分网页采集内容和项目一基本一致,但大几兆部分网页需要项目二(复制站点)才能浏览,项目一看不到图片项目二比项目一耗时多,但要全面视频教程https…

    2022年9月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号