• python------函数嵌套及作用域链


    命名空间

    命名空间一共分为三种:

      全局命名空间

      局部命名空间

      内置命名空间

    下面大家要了解一些底层的原理

    • 全局命名空间:创建的存储“变量名与值的关系”的空间叫做全局命名空间
    •    局部命名空间:在函数的运行中开辟的临时的空间叫做局部命名空间    (随着函数的结束临时空间结束)
    •    内置命名空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

    python文件在建立的时候就会先执行内置空间件在创建的时候就会由python自动为加载进内置空间 py文件内运行代码的时候就会再加载进全局空间 其次才会运行你函数内的局部空间

    其实加载的顺序就是

    加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

    然后才是取值  我们再取值的时候也会有先后顺序的  先去找局部内的值 然后再取寻找全局空间内的值 然后再取找内置空间内的值

    取值顺序:

      在局部调用:局部命名空间->全局命名空间->内置命名空间

      在全局调用:全局命名空间->内置命名空间

    作用域

    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

    全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

    局部作用域:局部名称空间,只能在局部范围生效

    1.命名空间和作用域是分不开的
      2.作用域分为两种:
           全局作用域:全局命名空间与内置命名空间的名字都属于全局范围
              在整个文件的任意位置都能被引用,全局有效
        局部作用域:局部命名空间,只能在局部范围内生效   
      3.站在全局看:
        使用名字的时候:如果全局有,用全局的
        如果全局没有,用内置的
      4.为什么要有作用域?
        为了函数内的变量不会影响到全局

    5.globals方法:查看全局作用域的名字【print(globals())】

       locals方法:查看局部作用域的名字【print(locals())】

    # a= 3
    # b =4
    # def func1():
    #     c= 5
    #     d= 6
    #     print(globals())  #globals()  是全局变量这就是把全局变量给打印出来
    #     print(locals())#这个代表是局部变量 就是把局部变量给打印出来
    a= 7
    b =9
    def funcl():
        d= 10 #这个是局部变量
        print(globals()) #获取全局变量的信息
        print(locals())  #获取局部变量的信息
    funcl()
    View Code

    global关键字,nonlocal关键字。

    global是让局部变量能能使用全局变量  而存在的

    global:

      1,声明一个全局变量。

      2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。  因为列表  字典之类的本身就可以不用global  它本身在全局内 就可以被使用

    #     global name   #把name这个局部变量 变成全局变量
    #     name ='老男孩'
    #     print(name)
    # func1()
    # print(name)   #因为name已经被global更改位全局变量了 所以我们就可以通过全局的print可以给打印出来
    #
    # a =4
    # def func1():
    #     global a  #把全局变量的a给更改了 在局部在用global对一个变量进行操作 就是把局部内变量啊a 也变成全局的  然后局部内的就可以把去全局内的覆盖 就改变了全局的值
    #
    #     a= 5
    # func1()
    # print(a)
    a = 8
    def func():
        global a  #因为这一步已经把这个局部内的变量变成了去全局变量 而全局内又有一个变量  那么我们局部内的变成全局内的变量就可以把这个变量覆盖掉
        a=6
    func()
    print(a)

    nonlocal:

      1,不能修改全局变量。

      2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改        变。

    # nonlocal不能修改全局变量
    # def func1():
    #     a= 4
    #     # print(a)
    #
    #     def func2():
    #         nonlocal a
    #         a= 5
    #         print(a)
    #     func2()  #这个必须有 因为 只是把func2放在在func1中了   还没有调用呢
    # func1()
    # print(a)
  • 相关阅读:
    [转自老马的文章]用MODI OCR 21种语言
    [转老马的文章]MODI中的OCR模块
    贴片晶振的脚位方向如何区分
    晶振简介及如何使用示波器测试晶振
    Lintcode 150.买卖股票的最佳时机 II
    Lintcode 82.落单的数
    Lintcode 97.二叉树的最大深度
    Lintcode 9.Fizz Buzz 问题
    LeetCode之461. Hamming Distance
    NYOJ之题目325 zb的生日
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/8672238.html
Copyright © 2020-2023  润新知