Pyhon的命名空间

一: 概念

  我们给存放名字和值的关系的空间起一个名字叫命名空间. 我们的变量在存储的时候就是存储在这片空间中的.

  详细解释:

    在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就  是说一开始的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空.

二: 分类

  1.全局命名空间 : 我们直接在py文件中,函数外声明的变量都属于全局命名空间

  2. 局部命名空间 : 在函数中声明的变量会存放在局部命名空间

  3. 内置命名空间 : 用于存放python解释器为我们提供的名字,比如list,tuple,str,int等

三 : 顺序

  加载顺序: 内置命名空间 > 全局命名空间 > 局部命名空间(函数被执行的时候)

  取值顺序: 局部命名空间 > 全局命名空间 > 内置命名空间

a = 10
def func():
    a = 20
print(a)
func() # 20

四 : 作用域

   也叫作用范围,按照生效范围可以分为全局作用域和局部作用域

   全局作用域 : 包含内置命名空间和全局命名空间,在整个文件的任何位置都可以使用(遵循从上到下逐行执行)

   局部作用域 : 在函数内部使用

   可以使用globs()函数查看全局作用域中的内容,使用locas()函数查看局部作用域中的变量和函数信息

a = 10
def func():
    a = 40
    b = 20
    def abc():
        print("哈哈")
    print(a, b) # 这里使用的是局部作用域
    print(globals()) # 打印全局作用域中的内容
    print(locals()) # 打印局部作用域中的内容
func()        

五 : 两个关键字global和nonlocal

    首先我们写这样一个代码,首先在全局声明一个变量,然后在局部调用这个变量,并改变它的值

a = 100
def func():
    global a # 加了个global表示不不在局部创建这个变量了. 而是直接使用全局的a
    a = 28
    print(a)
func()
print(a)

    global表示,不再使用局部作用域中的变量了,改用全局的变量

lst = ["麻花藤", "刘嘉玲", "詹姆斯"]
def func():
    lst.append("⻢马云云") # 对于可变数据类型可以直接进行访问. 但是不能改地址. 说白了. 不能赋值
    print(lst)
func()
print(lst)

    nonlocal表示在局部作用域中,调用父级命名空间中的变量

a = 10
def func1():
    a = 20
    def func2():
        nonlocal a
        a = 30
        print(a)
    func2()
    print(a)
func1()
结果:
加了nonlocal
30
30
不加nonlocal
30
20
原文地址:https://www.cnblogs.com/DoingBe/p/9416195.html