zoukankan      html  css  js  c++  java
  • Python Day 10 函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)

    Python Day 10  函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)

     名称空间(命名空间):

    当程序运行时,代码从上至下一次读取,遇到变量与值
    他会在内存中开辟一个空间,存放变量与值的内存地址的对应关系
    这样存储变量与值得对应关系的空间叫做名称空间(命名空间)。

    内置名称空间

      内置名称空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
        

    全局名称空间

           代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间


    局部名称空间

       当解释器遇到函数时,他会将函数名存储在内存中,但是对于函数体漠不关心。
       当函数执行时,他会通过函数名找到函数体,然后将函数体里面的变量等对应关系存放在一个
       临时开辟的空间中,随着函数的结束,临时的空间关闭,这样的空间叫做局部命名空间

    加载顺序:

      内置名称空间 ---> 全局名称空间(程序运行时) ---->局部名称空间(函数执行时)

    作用域:   

      全局作用域:内置名称空间 全局名称空间
      局部作用域:局部名称空间

    L local
    E eclose
    G global
    B Built-in

    取值顺序(单项):

      局部名称空间(函数执行时) ---> 全局名称空间 ---> 内置名称空间

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

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

      在找寻变量时,从小范围,一层一层到大范围去找寻。

    函数的作用域链:

      小范围作用域可以使用大范围的变量,但是反之不行,他是单向的。

    sum = 666  # global
    
    def func1():
        sum = 555  # eclose
        print(sum)
        def inner():
            pass
            sum = 111   # local
            # print(sum)
        inner()
    
    func1()

    global,nonlocal

    global

    如何在全局名称空间里得到局部名称空间的变量
      1,return
      2,global
        1,在局部作用域中声明一个全局变量。
        2,在局部作用域中,更改一个全局变量。
        补充:
        对于可变的数据类型,函数中如果对其进行操作,改变全局不用引用global. (append,pop....)

    l1 = [1, 2, 3]
    def func1():
        l1.append(666)
    func1()
    print(l1)

    nonlocal

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

    def func1():
        name = 'alex'
        print(name)  # 1, alex
        def inner():
            nonlocal name
            name = '老男孩'
            print(name)  # 2 老男孩
        inner()
        print(name)  # 3,alex 老男孩
    func1()
    def add_b():
        b = 42
        def do_global():
            b = 10  # 这一层
            print(b)  # 1,10
            def dd_nonlocal():
                nonlocal b
                b = b + 20
                print(b)  # 2,30
            dd_nonlocal()
            print(b)  # 3,30
        do_global()
        print(b)  #4,42
    add_b()
  • 相关阅读:
    待办
    安卓微信浏览器修改的代码总是不生效
    微信浏览器内核2
    微信浏览器内核
    随记
    三次握手最后一个ack没有收到怎么办?
    判断偶数:
    利用kubeadm工具安装Kubernetes1.15版本
    kubernetes安装Helm
    最大子列和(附加子列初始元素和末尾元素)
  • 原文地址:https://www.cnblogs.com/eailoo/p/9019730.html
Copyright © 2011-2022 走看看