zoukankan      html  css  js  c++  java
  • python中的关键字global和nonlocal

    知识点:

    global将一个变量变为全局变量

    nonlocal改变最近的变量,又不是全局作用。

    1.global

    在python中,当引用一个变量的时候,对这个变量的搜索按找本地作用域(Local)、嵌套作用域(Encolosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则。

    m = 1    #全局
    def fun1():
        m = 2    #嵌套
        def fun2():
            m = 3    #本地
        fun2()
    fun1()

    当在函数中给一个变量赋值的时候,python总是创建或者改变本地作用域的变量名,因此你无法在一个函数外调用函数内的变量,也无法在函数内改变一个函数外的变量。就像下面

    #外层无法引用内层变量
    def fun1():
        k = 10
    fun1()
    print(k)
    
    结果:
    Traceback (most recent call last):
      File "I:/untitled/cx/11月/11-17面向对象/1.属性.py", line 83, in <module>
        print(k)
    NameError: name 'k' is not defined
    
    #内存无法改变外层变量
    k = 100
    def fun1():
        k = k + 50
    fun1()
    print(k)
    
    #结果
    Traceback (most recent call last):
    ...
    UnboundLocalError: local variable 'k' referenced before assignment

    如果在函数中改变函数外的变量或者在函数外调用函数内的变量时,可以使用global。

    global可以将一个变量变为全局变量。在内部改变或者在外部引用。

    def fun1():
        global k
        k = 50
    fun1()
    print(k)
    
    或者这样
    k = 10
    def fun1():
        global k
        k = 50
    fun1()
    print(k)

    2.nonlocal

    nonlocal可以在一个嵌套的函数中修改嵌套作用域中的变量,理论上是修改离它最近的变量,但不会改变全局。

    #这是正常情况
    def func3():
        n = 1
        def func4():
            n = 2      
            def func5():
                n = 5
                print(n) #5   
            func5()
            print(n)   #2
        func4()
        print(n)   #1
    func3()

    加入nonlocal之后

    def func3():
        n = 1
        def func4():
            n = 2       #最近的n = 5
            def func5():
                nonlocal n
                n = 5
                print(n) #5
            func5()
            print(n)   #5
        func4()
        print(n)   #1
    func3()

    还可能这样:

    def func3(): 
        n = 1  #这里最近n =5
        def func4():
            # n = 2       
            def func5():
                nonlocal n
                n = 5
                print(n) #5
            func5()
            print(n)   #5   继承func3
        func4()
        print(n)   #5
    func3()

    不会改变全局

    n =100
    def func3():
        n = 1  #这里最近n =5
        def func4():
            def func5():
                nonlocal n
                n = 5
                print(n) #5
            func5()
            print(n)   #5   继承func3
        func4()
        print(n)   #5
    func3()
    
    #结果
    5
    5
    5
    100
  • 相关阅读:
    移动端图片懒加载插件
    Animate.css 教程
    git使用图解
    React-Native学习指南
    react-native 环境配置及hello world
    修改文件后浏览器自动刷新解决方案
    react-native 布局基础
    MongoDB数据库安装及配置环境(windows10系统)
    MongoDb windows环境安装,附百度云链接
    常用的几类npm依赖包管理
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7852687.html
Copyright © 2011-2022 走看看