zoukankan      html  css  js  c++  java
  • 函数的名称空间,函数的嵌套(global, nonlocal),函数名的运用

    一 函数的名称空间

    1. 内置空间:存放python解释器内置函数的空间
    2. 全局空间:py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量与值的对用关系,整个py文件结束后才会消失.
    3. 局部空间:函数定义时,会记录下函数名与函数体的对应关系(什么都没有,只要内存地址,只有执行时才会在内存中临时开辟一个临时空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失)

    加载顺序:内置空间 > 全局空间 > 局部空间

    取值顺序:局部空间 > 全局空间 > 内置空间

    1. 作用域

      全局作用域:内置空间 + 全局空间

      局部作用域:局部空间

    二 函数的嵌套

    只要遇到变量名()就是函数的调用,没有()就不是函数的调用

    函数调用执行后,函数体中开辟的空间就自动销毁了

    2.1 嵌套

    def func():
        a = 1
        def foo():
            b = 2
            print(b)  # 2
            print(a)  # 1
            def f1():
                print(b) # 2
            return f1()
        return foo()
    print(func())
    

    结果:

    2
    1
    2
    None

    局部空间里的变量就近使用上一级空间和全局空间里的变量,两个并列局部空间里的变量不能相互使用

    2.2 函数互相引用

    def a():
        a = 1
        c()
        print(c)
    
    def c():
        c = 3
        print(a)
    def run():
        a()
    run()
    

    结果:

    <function a at 0x0000000002101E18>
    <function c at 0x00000000025B98C8>

    输出的是定义函数ac的内存地址,并列的内置空间里的变量不能相互使用

    2.3 global 和 nonlocal

    1. global 只修改全局变量对应的值

    a = 10
    def func():
        global a  # 声明修改全局变量的值
        a += 1
        print(a)
    func()
    print(a)
    

    结果:

    11
    11

    在函数内部修改全局的变量,如果全局中不存在就创建一个变量

    lst = ["麻花藤", "刘嘉玲", "詹姆斯"]
    def func():
        lst.append("马云")   # 对于可变数据类型可以直接进行访问
        print(lst)
    func()
    print(lst)
    

    结果:

    ['麻花藤', '刘嘉玲', '詹姆斯', '马云']
    ['麻花藤', '刘嘉玲', '詹姆斯', '马云']

    2. nonlocal 就近修改局部空间的变量值,不会修改全局空间的变量值

    a = 10
    def func():
        def f1():
            a = 20
            def foo():
                nonlocal a
                a += 1
                print(a)   # 21
            foo()
            print(a) # 21
        f1()
    func()
    print(a)   # 10
    

    输出:

    21
    21
    10

    三 函数名的运用

    1. 函数名的内存地址

      print(func)

    2. 函数名可以赋值给其他变量

    3. 函数名可以当做函数的参数去传递

      注意点:传递函数名的时候如果+()就是在传递这个函数的返回值

    4. 函数名可以当做函数的返回值被返回

    5. 函数名可以当做元素存放在一个容器里

  • 相关阅读:
    第02组 Alpha冲刺 (6/6)
    面向对象分析设计考试复习【历年卷】
    第02组 Alpha冲刺 (5/6)
    第02组 Alpha冲刺 (4/6)
    第02组 Alpha冲刺 (3/6)
    第02组 Alpha冲刺 (2/6)
    第02组 Alpha冲刺 (1/6)
    linux内核结构
    从别人的博客学习
    递归的认识
  • 原文地址:https://www.cnblogs.com/lav3nder/p/11801516.html
Copyright © 2011-2022 走看看