zoukankan      html  css  js  c++  java
  • Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链

    命名空间

          -------‘’存放名字与值的关系”的空间

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

    在函数的运行中开辟的临时的空间叫做局部命名空间。

    命名空间一共分为三种:

      全局命名空间

      局部命名空间

      内置命名空间

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

    三种命名空间之间的加载与取值顺序:

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

    取值顺序:

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

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

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

    全局
    
    name='oldzhang'
    def func():
        print(name)
    func()    #oldzhang
    局部
    
    name='oldzhang'
    def func():
        name='oldwang'
        print(name)
    func()        #oldwang
    内置
    
    def len(x):
        return x
    print(len([1,2,3]))    #[1, 2, 3]

    作用域

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

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

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

    #先从局部作用域找,然后再从全局作用域找

    #print(globals())
    #print(locals())
    
    def func():
        a = 12
        b = 20
        print(locals())
        print(globals())
    
    func()
    
    
    '''
    {'b': 20, 'a': 12}
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000212A588>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python10/day10/test1.py', '__cached__': None, 'func': <function func at 0x0000000001D03E18>}
    '''

    global关键字,nonlocal关键字

    global:

      1,声明一个全局变量。

      2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。  #字符串、数字不可变

    def func():
        global a
        a = 3
    func()
    print(a)
    
    
    count = 1
    def search():
        global count
        count = 2
    search()
    print(count)

    ps:对可变数据类型(list,dict,set)可以直接引用不用通过global。

    li = [1,2,3]
    dic = {'a':'b'}
    
    def change():
        li.append('a')
        dic['q'] = 'g'
        print(dic)
        print(li)
    change()
    print(li)
    print(dic)

    nonlocal:  #python3之后才有,之前没有

    1,不能修改全局变量。

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

     1 def add_b():
     2     b = 42
     3     def do_global():
     4         b = 10
     5         print(b)
     6         def dd_nonlocal():
     7             nonlocal b
     8             b = b + 20
     9             print(b)
    10         dd_nonlocal()
    11         print(b)
    12     do_global()
    13     print(b)
    14 add_b()

    函数的嵌套和作用域链

    函数的嵌套调用

    局部函数找全局函数能够找到并且执行。

    全局不能找到局部函数内的嵌套函数。如果要执行嵌套函数需要对齐嵌套的函数写下函数才能顺利执行。

    def max2(x,y):
        m  = x if x>y else y
        return m
    
    def max4(a,b,c,d):
        res1 = max2(a,b)
        res2 = max2(res1,c)
        res3 = max2(res2,d)
        return res3
    
    # max4(23,-7,31,11)
    
    函数的嵌套调用

    函数的嵌套定义

    def f1():
        print("in f1")
        def f2():
            print("in f2")
    
        f2()
    f1()
    ###########
    def f1():
        def f2():
            def f3():
                print("in f3")
            print("in f2")
            f3()
        print("in f1")
        f2()
        
    f1()

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

    def f1():
        a = 1
        def f2():
            def f3():
                print(a)
            f3()
        f2()
    
    f1()
    ################
    def f1():
        a = 1
        def f2():
            a = 2
        f2()
        print('a in f1 : ',a)
    
    f1()
  • 相关阅读:
    自定义动画animate()
    【Java】正则表达式
    【Java】连接数据库SQLServer
    【Java】导入导出TXT文件
    【数据库】SELECT语句
    数据结构与算法系列之目录
    【Java】员工统计
    【Java】生产者消费者模式
    【Java】购物超市
    【Java】导入导出Excel表格
  • 原文地址:https://www.cnblogs.com/strive-man/p/8399964.html
Copyright © 2011-2022 走看看