• 函数-作用域


    函数作用域:

    作用域作用的范围

    1全局作用范围:就是全局作用域(内置名称空间与全局名称空间)

    全局有效 全局存活

     

    2 局部作用范围: 局部作用域(局部名称空间)

    局部有效 临时存活

     

    x=1

    def f1():

        def f2():

            def f3():

                print(len)      # 都能找到 1 和len

                print(x)

            f3()

        f2()

    f1()

    能访问到 len 叫全局有效 定义f1 内部就两行代码

    如:

    def f2():

    f2()

    其他代码就不考虑

    f2  内部就是  def f2():   f2()两行代码

     

    x=1

    y=2

    def f1():

        def f2():

            def f3():

                x=3

                y=5

                print(x)

                print(y)        #输出 3 5   从内部 f3 开始找到xy

            f3()

        f2()

    f1()

     

    x=1

    def f1():

        def f2():

            def f3():

                x=222222

                print(x)

                x=2222222     #   x=22222222 缩进写为什么报错   写法错误 不能写到print下面

            f3()

        f2()

    f1()

     

    def foo():

        x=2

        print(x)

    foo()

     

    x=1

    def f1():

        def f2():

            def f3():

                # x=2

                print(x)

            x=2222222      # 程序先从局部f3开始 找到x=2  注释掉后 在f2内找到x=222222

            f3()

        f2()

    f1()

     

    x=1

    def f1():

        def f2():

            def f3():

                zzz=333333

                print(x)   #在局部找到x=22222

            x=222222

            f3()

        f2()

    def bar():

        # print(zzz)     # 找不到 因为zzz=333是f1f2f3内的函数 所以报错

        print(x)      #  在全局名称找到  x=1

    f1()

    bar()

    作用域关系是在函数定义阶段就固定死了 与函数的调用位置无关  但凡调用函数都需要到定义阶段找作用域关系

     

    #

    x=1

    def f1():

        print(x)

    f1()

    x=11111111

    def f2():

        print(f1)

        x=22   # 调用f2 找到f1和f2内部的x=22 没有关系

        f1()

    f2()

    调f2()找到f1()和f2内部的x=22没有关系、到f1内部找到x=111111111因为当你调用f2时x已经被攥改写成

    11111111如果注释掉下面的f1()  那么x=1

    输出

    # 1

    <function f1 at 0x000001DAA0E8A7B8>

    11111111

     

     

    补充知识点

    1、、、函数对象加作用域的结合

    def f1():

        def inner():

            print('from inner')

        # return inner     # 不加return 报错  return 能返回给全局当中

    f=f1()

    print(f)      # <function f1.<locals>.inner at 0x000001D8994BA730>

    f()

    输出

    from inner

     

     

    def f1():

        def inner():

            print('from inner')

        return inner

    f=f1()

    def der():

        f()

    der()

    输出from inner

        der()调用  找到  f 在找到f1 在找到inner  return 到全局 输出 from inner

    def f1():

        x=1

        def inner():

            print('from inner',x)

        return inner

    f=f1()

    def bar():

        x=1111111111111111

        f()

    bar()

     

    输出 from inner 1   因为调用里的x=1111111不好使

     

    x=1

    def foo():

        x=2

    foo()

    print(x)

    输出1  因为print 是在全局的打印 所以 x=2是局部的名称空间 所以访问不到 只能访问造全局的x=1

    我想在局部里改全局的x=1 改成2呢 用global

    x=1

    def foo():

        global x

        x=2

    foo()

    print(x)

     

     

     

    x=1

    def f1():

        def f2():

            def f3():

                global x

                x=1111111111

            f3()

        f2()

    f1()

    print(x)   # 因为是改全局的变量所以print 写在全局上

     

    nonlocal  是改 局部里的

    x=1

    def f1():

        def f2():

            x=2222222222

            def f3():

                nonlocal x

                x=1111111111           #把x=222222 改成  111111

            f3()

            print(x)

        f2()

    f1()

     

     

    不可变类型:

    x=1

    def f1():

        x=222

    f1()

    print(x)

    改不了 只能用global声明

    x=1

    def f1():

        global x

        x=222

    f1()

    print(x)

     

    可变类型

    x=[]

    def f1():

        x.append(1)  # 一个列表把1这个值放在全局x=[]里

    f1()

    print(x)

  • 相关阅读:
    MySQL sys Schema 简单介绍-2
    dubbo服务+Spring事务+AOP动态数据源切换 出错
    sql 查询优化
    spring事务-说说Propagation及其实现原理
    Redis 分布式锁
    三、操作符
    二、一切皆是对象
    一、对象导论
    SpringMVC工作原理
    数据库性能优化策略
  • 原文地址:https://www.cnblogs.com/andy117/p/11018795.html
Copyright © 2020-2023  润新知