Python基础 7 函数 命名空间

 

Python的命名空间的本质是一个字典,用来记录变量名称和值。字典的key是变量的名称,字典的value对于的是变量的值。

例如 {name:zs,age:10}

命名空间一共分为三种:局部命名空间全局命名空间内置命名空间

局部空间:

         每个函数都有自己的命名空间,叫做局部空间,它记录了函数的变量,包括函数的参数 和局部定义的变量

全局空间:

         每个模块拥有他自己的命名空间,叫做全局命名空间,他记录了模块的变量,包括函数、类、其他导入的模块

内置名称空间:

          任何模块都可以访问他,他存放着内置的函数和异常

          input   print  str   list   tuple

命名空间的访问

局部名称空间使用   locals()函数来访问

全局命名空间的访问使用   globals()函数访问


def func(name,age):
    num = 10
    ret = locals()  #局部命名空间
    print(ret)      #{'age': '10', 'name': 'zs', 'num': 10}
func('zs','10')

a = 10
def func(name,age):
    num = 10
    ret = locals()  #局部命名空间
    print(ret)      #{'age': '10', 'name': 'zs', 'num': 10}
func('zs','10')
ret = globals()     #获取全局变量
print(ret)


{'age': '10', 'name': 'zs', 'num': 10}
{'__spec__': None, '__name__': '__main__', 'ret': {...}, '__cached__': None, '__file__': 'D:/Pythonworkspace/day08/demo1.py', 'func': <function func at 0x00000000011867B8>, '__doc__': '\n命名空间\n', 'a': 10, '__builtins__': <module 'builtins' (built-in)>, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000FA8AC8>}

里面有很多内置变量名称

2命名空间的加载顺序

内置命名空间(程序运行前加载)------>>>

全局命名空间(程序运行中:从上到下加载)---------->>>

局部命名空间(程序运行中:调用时才加载)当函数返回结果或抛出异常时,被删除。每一个递归调用的函数都用自己的命名空间

3 命名空间的查找顺序

当使用某个变量的时候,先从局部命名空间中找,如果能找到则停止搜索,如果找不到在去全局名称空间中查找,如果找到则停止搜索,如果找不到则到内置名称空间中查找,如果找不到则报错。

id= 10
def func():
    id = 20
    print(id)      20
func()
print(id)          10
  查找顺序   局部   全局   内置
  如果先从局部命名空间中查找到   则停止搜索,一次向下进行查找,做后如果查不到就报错
  如果一开始就在全局空间中查找 ,找不到就去内置空间中去查找  ,找到就打印,找不到就报错

嵌套函数的情况:

     1、先在当前 (嵌套的或 lambda) 函数的命名空间中搜索

     2、然后是在父函数的命名空间中搜索

     3、接着是模块命名空间中搜索

     4、最后在内置命名空间中搜索

id = 10
def outter():
    id = 11
    def inner():
        id = 12
        print(id)   #12
    inner()
outter()

猜你喜欢

转载自blog.csdn.net/weixin_44303465/article/details/85796843
今日推荐