码迷,mamicode.com
首页 > 编程语言 > 详细

python函数名称空间

时间:2018-03-18 14:57:21      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:tin   UI   ...   color   结果   pytho   返回值   family   font   

一、命名空间概念

命名空间(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函数名称空间

标签:tin   UI   ...   color   结果   pytho   返回值   family   font   

原文地址:https://www.cnblogs.com/xiugeng/p/8595203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!