1,细说变量:对于赋值语句,例如x = 1,类似于字典的键值,有一个vars内置函数,返回一个不可见的字典
x = 1
y = vars()
print(y['x'])
print(y['x']+=1)
# 输出为 1,2
可见命名空间即为一个储存变量的字典
2,locals,globals函数,用来获取当前作用域的命名空间,返回为字典
如果在全局作用域中用locals函数,则获取全局作用域命名空间,若在函数内用globals函数,则获取局部作用域命名空间。globals函数表示全局作用域命名空间
a = 10
print(locals())
print(globals())
#输出为
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020E0350FEF0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '序列简书.py', '__cached__': None, 'ndint': <function ndint at 0x0000020E034CC268>, 'a': 10}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020E0350FEF0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '序列简书.py', '__cached__': None, 'ndint': <function ndint at 0x0000020E034CC268>, 'a': 10}
# 二者这时没有区别,都返回相同的字典
看来可以通过赋值语句来生成字典,那么可不可以反过来呢,看代码
a = 10
locals()['b'] = 20 #赋值即为b = 20
print(b)
# 输出为 20
可见可以用字典的方式来赋值!!!!!
3,globals和locals函数的区别,看代码
a = 15
def x():
b = 20
print(locals())
print(globals())
x()
# 输出为
{'b': 20}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001776643FEF0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '序列简书.py', '__cached__': None, 'a': 15, 'x': <function x at 0x00000177663FC268>}
3,用字典方式修改全局变量和局部变量
a = 10
def b():
c = 20
locals()['c'] = 10 #修改局部变量值
globals()['a'] = 20 #修改全局变量值
print(a)
print(b)
b()
# 输出为
20
20
locals() 返回是当前局部变量的深拷贝,修改locals() 中变量值,实际上对于原变量是没有任何影响的。而globals()返回的是全局变量的字典,修改其中的内容,值会真正的发生改变。