函数-作用域

函数作用域:

作用域作用的范围

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)

posted @ 2019-06-13 19:08  andy117  阅读(218)  评论(0编辑  收藏  举报