python2 nonlocal_python关键字及用法

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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关键字及用法

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mybatis返回结果为map_mybatis是如何分页的

    mybatis返回结果为map_mybatis是如何分页的表:members中的gender列是这样:FemaleFemaleMaleFemaleMaleMaleMaleMaleMale现在我们想统计members中男女人数分别是多少,很显然返回的结果应该是这样的:Femal:3Male:6对应的xml文件中的查询语句:<selectid=”genderCount”resultMap=”genderCount”>selectgender,count(gende

  • 为什么说程序员做外包没前途呢_外包程序员

    为什么说程序员做外包没前途呢_外包程序员之前做过不到3个月的外包,2020的第一天就被释放了,2019年还剩1天,我从外包公司离职了。我就谈谈我个人的看法吧。首先我们定义一下什么是有前途 稳定的工作环境 不错的收入 能够在项目中不断提升自己的技能(ps:非技术上的认知也算) 找下家的时候能找到一份工资更高的工作 如果你目前还年轻,但高不成低不就,只有外包offer,那请往下看。外包公司你应该…

  • PWM原理 PWM频率与占空比详解

    PWM原理 PWM频率与占空比详解什么是PWM​脉冲宽度调制(PWM),是英文“PulseWidthModulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。​]…

  • 启动马达接线实物图_电动机星三角换接起动原理图解

    启动马达接线实物图_电动机星三角换接起动原理图解采用星三角换接起动,此方式起动为降压起动方式的一种。三角形起动即电动机正常工作时定子接成三角形,起动时接成星形,起动完毕后转速接近额定值时再换成三角形。这样做起动时就把定子每相绕组上的电压降到额定电压的1/√3起动电流降低到1/3额定电流,起动转矩也降低到1/3额定转矩。1、控制电路设计图星三角降压起动2、的讲解:(1)本设计采用220v控制380v电动机工作,电动机定子绕组起动时为星形,在…

  • hogwarts sorting hat_huge squares

    hogwarts sorting hat_huge squares1.概述murmurhash是AustinAppleby于2008年创立的一种非加密hash算法,适用于基于hash进行查找的场景。murmurhash最新版本是MurMurHash3,支持32位、64位及128位值的产生。murmurhash标准使用c++实现,但是…

  • java笔试题大全带答案_java笔试题大全带答案(经典11题)[通俗易懂]

    java笔试题大全带答案_java笔试题大全带答案(经典11题)[通俗易懂]#java笔试题大全带答案(经典11题)**1.不通过构造函数也能创建对象吗()**A.是B.否**分析:答案:A**Java创建对象的几种方式(重要):(1)用new语句创建对象,这是最常见的创建对象的方法。(2)运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。(3)调用对象的clo…

发表回复

您的电子邮箱地址不会被公开。

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