python函数名称空间

Posted 休耕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python函数名称空间相关的知识,希望对你有一定的参考价值。

一、命名空间概念

命名空间(name space),若变量x=1,1存放在内存中,命名空间是存放名字x、x与1绑定关系的地方。
命名空间分三种:

  • locals:函数内的名称空间,包括局部变量和形参
  • globals:全局变量,函数定义所在模块的名字空间
  • builtins:内置模块的名字空间 dir(__builtins__)查看所有内置方法

作用域:python中一个函数就是一个作用域,局部变量放置在其作用域中;代码定义完成后,作用域已经完成,作用域链向上查找
    C# Java中作用域{}

不同变量的作用域不同就是由这个变量所在的命名空间决定的:
作用域即范围:
  全局范围:全局存活,全局有效
  局部范围:临时存活,局部有效

二、作用域查找顺序

 

LEGB:locals ——>enclosing(相邻的上一级) ——>globals ——> __builtins__
  • locals 是函数内的名字空间,包括局部变量和形参
  • enclosing 外部嵌套函数的名字空间
  • globals 全局变量,函数定义所在模块的名字空间
  • builtins 内置模块的名字空间
n = 10
def fun1():
    n = 20
    print(func1,n)

    def fun2():
        n = 30
        print(func2,n)

        def func3():
            print("func3",n)    # locals没有,先找相邻上一级作用域
        func3()  # 20
    fun2()  # 30  
fun1()  # 30
def func():
    level = L1
    n = 33
    print(locals())  # {‘level‘: ‘L1‘, ‘n‘: 33}

    def outer():
        n = 44
        level = L2
        print(locals(), n)

        def inner():
            level = L3
            print(locals(), n)
        inner()  # {‘n‘: 44, ‘level‘: ‘L3‘} 44
    outer()  # {‘n‘: 44, ‘level‘: ‘L2‘} 44


func()
三、嵌套函数返回值
age = 18
def func1():
    age = 73
    def func2():
        age = 84
        print(age)

    return 666

val = func1()
print(val)
‘‘‘
输出:666
‘‘‘
# 函数名可以当作返回值
age = 18
def func1():
    age = 73
    def func2():...
    return func2   # 返回一个函数名# val = func1()
print(val)
‘‘‘
输出:<function func1.<locals>.func2 at 0x101462598>
‘‘‘

# 代码写完之后作用域已经生成,不管函数名传到哪里,只要执行都回回定义的地方往上找
age = 18
def func1():
    age = 73
    def func2():
        print(age)
    return func2   # 返回一个函数名不带括号

val = func1()
val()
‘‘‘
输出结果:73
‘‘‘
四、查看作用域方法

globals(),locals()

 








以上是关于python函数名称空间的主要内容,如果未能解决你的问题,请参考以下文章

013.Python之函数嵌套名称空间与作用域闭包函数

python第四天学习总结

函数-名称空间

python——函数 11命名空间

python---函数的应用,闭包,装饰器

0510Python基础-动态参数-名称空间