• day15 名称空间与作用域


    一、参数补充

    1 命名关键字参数(了解)

    命名关键字参数:在定义函数时,*后定义的参数,如下所示,称之为命名关键字参数

    特点1:命名关键字实参必须按照key=value的形式为其传值

    def func(x,y,*,a,b):
        print(x,y,a,b)
    func(1,2,b=123,a=321)
    #a和b必须用关键字实参传值不然报错
    

    多形式混用:

    #形参混用的顺序:位置新参,默认形参,*args,命名关键字形参,**kwargs
    def func(x,y=111,*args,z,**kwargs):
        print(x)
        print(y)
        print(args)
        print(z)
        print(kwargs)
    func(1,2,3,4,z=13,a=123,b=123)
    >>>1
    >>>2
    >>>(3, 4)
    >>>13
    >>>{'a': 123, 'b': 123}
    

    二、名称空间

    名称空间是指存放名字和对象的映射关系/绑定关系的地方,例如x=3,在内存中的栈区里开辟了一个空间来存放x和x与10的绑定关系,这个空间就是名称空间。

    1.内置名称空间

    存放的名字:存放的python解释器内置的名字

    存活周期:python解释器启动则产生,python解释器关闭则销毁

    '''
    >>> print
    <built-in function print>
    >>> input
    <built-in function input>
    '''
    

    2.全局名称空间

    存放的名字:只要不是函数内定义,也不是内置的,就是全局名称

    存活周期:python文件执行则产生,关闭则销毁

    import os #os为全局名称
    x=10 #x是全局名称
    if True:
        y=10#y是全局名称
    def func():#func是全局名称
        pass
    class Foo:#Foo是全局名称
        pass
    

    3.局部名称空间

    存放的名字:在函数调用时,运行函数体代码的过程中产生的函数内的名字

    存活周期:在调用函数时存活,函数调用完毕后则销毁

    def func(x,y):
        z=10
    func(1,2)
    

    4.名称空间的加载与销毁顺序

    加载顺序

    内置名称空间>全局名称空间>局部名称空间

    销毁顺序

    局部名称空间>全局名称空间>内置名称空间

    名字的查找顺序

    由当前位置向上一层查找

    由内到外依次是局部名称空间>全局名称空间>内置名称空间

    通过示范来解释名称空间的嵌套使用

    注意:名称空间的嵌套关系是以函数定义阶段为准,和调用位置无关

    实例1:

    x=1 
    def func(): #第五步:执行func函数体代码
       print(x) #输出x,在该名称空间找不到x,搜索全局名称空间查找到x=1
    def foo(): #第二步:执行foo函数体代码
        x=222 #第三步:执行第一行,定义局部变量x=10
        func() #第四步:调用func函数,foo函数到此结束,销毁内部的局部变量,即x=10
    foo()  #第一步:调用foo函数
    >>>1 #第六步:执行代码得到1
    

    实例2:

    x=10
    #此处报错是因为在函数定义阶段违反了变量先定义后引用的规则
    def foo():
        print(x)
        x=20
    foo()
    >>>报错
    

    三、作用域

    即名称空间的作用范围

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

    1.全局存活

    2.全局有效,被所有函数共享

    x=111
    def foo():
        print(x,id(x))
    def bar():
        print(x,id(x))
    foo()
    bar()
    >>>111 140717457109072
    >>>111 140717457109072
    >>>111 140717457109072
    

    局部作用域:局部名称空间

    1.临时存活

    2.局部有效,函数内有效

    def foo(x):
        def f1():
            def f2():
                print(x)
            f2()
        f1()
    foo(1)
    

    示范1:(global)如果想在局部里修改全局对应的变量值(不可变类型),就需要用到global

    x=111
    def func():
        global x # 声明x这个名字是全局的名字,不要再造新的名字了
        x=222
    func()
    print(x)
    

    示范2:(nonlocal)修改函数外层函数包含的不可变类型

    x=0
    def f1():
        x=11
        def f2():
            nonlocal x#让接下来的x=22作用在外层函数
            x=22
        f2()
        print('f1内的x:',x)
    f1()
    print(x)
    >>>f1内的x: 22
    >>>0
    
  • 相关阅读:
    Delphi 实现C语言函数调用
    Delphi采用接口实现DLL调用
    select、poll、epoll之间的区别总结[整理]
    int 的重载
    qt 安装包生成2
    线程池的简单实现
    qt 安装包生成
    linux 下tftpf搭建
    2018C语言助教总结
    动态规划——最长子序列长度
  • 原文地址:https://www.cnblogs.com/hz2lxt/p/12525688.html
Copyright © 2020-2023  润新知