2022年 11月 4日

python命名空间(五分钟读懂)

命名空间(namespace)

1.命名空间指的是变量存储的位置,每一个变量都需要存储到指定的命名空间当中
2.每一个作用域都会有一个它对应的命名空间
3.全局命名空间,用来保存全局变量。函数命名空间用来保存函数中的变量
4.命名空间实际上就是一个字典,是一个专门用来存储变量的字典

locals()用来获取当前作用域的命名空间

1.在全局作用域中调用locals()则获取-全局命名空间,
2.在函数作用域中调用locals()则获取-函数命名空间
3.它返回的是一个字典

globals() 函数可以用来在任意位置获取全局命名空间

没有定义函数中

a = [1,2,3]
b = (4,5,6)
c = {'c1':'7','c2':'8'}
dalao = locals()  # 当前命名空间
print(locals())   # 打印结果为{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x01918E20>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\Administrator\\102901.py', '__cached__': None, 'a': [1, 2, 3], 'b': (4, 5, 6), 'c': {'c1': '7', 'c2': '8'}, 'dalao': {...}}
print(dalao)      # 打印结果为{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x01918E20>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\Administrator\\102901.py', '__cached__': None, 'a': [1, 2, 3], 'b': (4, 5, 6), 'c': {'c1': '7', 'c2': '8'}, 'dalao': {...}}
print(type(dalao))# 打印结果为 <class 'dict'>
'''
    返回的是一个字典,那么就可以向字典中添加key-value就相当于在全局中创建了一个变量(一般不建议这么做)
 'a': [1, 2, 3], 'b': (4, 5, 6), 'c': {'c1': '7', 'c2': '8'}, 'dalao': {...}}
'''
print(a)           # 打印结果为[1, 2, 3]
print(dalao['a'])  # 打印结果为[1, 2, 3]
'''向dalao中修改一个key-value'''
dalao['c'] = 1000 # 向字典中添加key-value就相当于在全局中创建了一个变量(一般不建议这么做)
print(c)          # 打印结果为1000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

有定义的函数中

a = 1
def fn1():
    a = 10
    print(locals()) # 输出函数内的字典# 在函数内部调用locals()会获取到函数的命名空间
    locals()['b'] = 20 # 可以通过方法来操作函数的命名空间,但是也是不建议这么做
    print(locals()) # 输出函数内的字典# 在函数内部调用locals()会获取到函数的命名空间

fn1() 
'''结果为
{'a': 10}
{'a': 10, 'b': 20}
 '''
print(locals()) # 输出全局的字典
'''结果为
 {'__name__': '__main__', 
 '__doc__': None,
 '__package__': None,
 '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x029DAF58>,
 '__spec__': None,
 '__annotations__': {},
 '__builtins__': <module 'builtins' (built-in)>,
 '__file__': 'C:\\Users\\Administrator\\Desktop\\102902.py',
 '__cached__': None, 
 'a': 1,
 'fn1': <function fn1 at 0x02DEF3D0>}
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

globals() 函数可以用来在任意位置获取全局命名空间

例子:

a = 1
def fn1():
    a = 10
    print(locals())# 第1次打印内部的命名空间字典 
    print(globals())# 第一次打印全局变量
    globals()['a'] = 20     # 在函数内修改全局变量的内容
    print(globals())# 第二次打印全局变量
    print(locals()) # 第2次打印内部的命名空间字典
fn1() 
# 输出结果为
{'a': 10}
{省略内容, 'a': 1, 'fn1': <function fn1 at 0x02BFF3D0>}
{省略内容, 'a': 20, 'fn1': <function fn1 at 0x02BFF3D0>}
{'a': 10}

# 省略内容
'''
完整的第一次打印全局变量
省略内容开始
{'__name__': '__main__',
 '__doc__': None,
 '__package__': None,
 '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x007BAF58>,
 '__spec__': None,
 '__annotations__': {},
 '__builtins__': <module 'builtins' (built-in)>,
 '__file__': 'C:\\Users\\Administrator\\Desktop\\102902.py',
 '__cached__': None,# 结束省略内容
 'a': 1,
 'fn1': <function fn1 at 0x022FF3D0>}
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31