欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python基础-函数作用域

程序员文章站 2023-10-29 10:58:34
函数 函数对象 函数是 第一类对象 函数名可以 被引用 函数名可以当作 参数 使用 函数名可以当作 返回值 使用 函数名可以当作 容器类型的元素 函数嵌套 嵌套调用 :在函数内部中调用函数 嵌套定义 :在函数内部中定义函数 名称空间 存放变量名称 的空间,分为 内置名称空间 、 全局名称空间 、 局 ......

函数

函数对象

  • 函数是第一类对象
  • 函数名可以被引用
  • 函数名可以当作参数使用
  • 函数名可以当作返回值使用
  • 函数名可以当作容器类型的元素

函数嵌套

  • 嵌套调用:在函数内部中调用函数

  • 嵌套定义:在函数内部中定义函数

名称空间

存放变量名称的空间,分为内置名称空间全局名称空间局部名称空间

  • 内置名称空间:python中,提前定义的名字,存在内置名称空间中。例如:关键字、内置方法

  • 全局名称空间:存放于文件级别的名字,就是全局名称空间

    if / while / for 内部定义的名字,在执行之后都存放于全局名称空间

    # if 的示例:
    var = 4
    if var > 5:
        var = "var 大于5"
    else:
        var = "var 小于等于5"
    print(var)        # 打印结果:var 小于等于5
    
    # while 的示例:
    num = 0
    while num <= 3:
        num += 1
    print(num)        # 打印结果:4
    
    # for 的示例
    for i in range(2):
        pass
    print(i)      # 打印结果:1
  • 局部名称空间函数内部定义的所有名字都是存放于当前函数的内置名称空间

如果想访问一个变量值,必须先访问对应的名称空间,获取到该变量的名称以及名称和值内存地址之间的关系。

生命周期

  • 内置名称空间python 解释器启动时生效,关闭时失效
  • 全局名称空间当前python文件执行生效,执行结束后失效
  • 局部名称空间函数调用时生效,函数体代码结束时失效

查找顺序

  • 局部名称:局部 全局 内置函数

  • 全局名称:全局 内置

    内置再找不到就会报错

  • 函数内部使用的名字,在定义阶段已经规定死了,与调用位置无关

作用域

  • 全局作用域全局可以调用的名字存在于全局作用域。内置名称空间和全局名称空间属于此处
  • 局部作用域局部可以调用的名字存在于局部作用域。局部名称空间属于此处

  • global:将局部名称空间的变量声明成全局变量

    注意:global需要在函数内部声明,若在函数外声明,则函数依然无法操作

    # 这种情况不能修改x1的值
    x1 = 1
    def func1():
        x1 = 2
    func1()
    print(x1)  # 打印结果:1
    
    # 使用global 后,可以修改x2的值
    x2 = 1
    def func2():
        global x2 # 先声明成全局变量
        x2 = 2
    func2()
    print(x2) # 打印结果:2
    
    # global 若在函数外声明,无法操作变量
    global x3
    x3 = 1
    def func2():
        x3 = 2
    func3()
    print(x3) # 打印结果:1
  • nonlocal:在局部名称空间声明局部变量

    nonlocal 声明后的变量会从当前函数的外层函数开始一层层去查找该变量。若是一直到最外层函数都找不到,则会抛出异常。

    def f3():
        x = 4
        def f1():
            y = 2
            def f2():
                nonlocal x
                x = 3
            f2()  # 调用f2(),修改f1作用域中名字x的值
            print(x)  # 在f1作用域查看x。打印结果:3
        f1()
        print(x)  # 打印结果:3
    f3()
    def f3():
        x = 4
        def f1():
            x = 2
            def f2():
                nonlocal x
                x = 3
            f2()  # 调用f2(),修改f1作用域中名字x的值
            print(x)  # 在f1作用域查看x。打印结果:3
        f1()
        print(x)  # 打印结果:4
    f3()