#-*- coding:utf-8 -*-
#在python中,变量是以字典形式存储的存储的
#globals()是全局变量(其中还包括了一大堆诸如__main__之类的系统变量等特殊变量)
#locals()则是局部变量
#当然,在没有变量时局部变量是空,全局变量则是由一堆默认变量组成
def print_1():
print('locals():', locals())
print('globals():', globals())
print_1()
#顺带一提,在全局下,局部变量和全局变量是一样的
#print('locals():', locals())
#print('globals():', globals())
#创建一个值,局部变量就有内容了。
def print_2():
a = 1
b = 2
print('locals():', locals())
print('globals():', globals())
print_2()
#此外,基于python中的变量都是以字典形式储存的,这就为动态变量命名提供了可能
for i in range(3):
locals()['a{}'.format(i)] = i**2
print(a0, a1, a2)
#会报错
#…………………………通过上面的源码, 我们已经很明确知道locals() 看到的, 的确是函数的局部命名空间的内容, 但是它本身不能代表局部命名空间, 这就好像一个代理, 它收集了A, B, C的东西, 展示给我看, 但是我却不能简单的通过改变这个代理, 来改变A, B, C真正拥有的东西!
#这也就是为什么, 当我们通过locals()[i] = 1的方式去动态赋值时, print a却触发了NameError异常, 而相反的, globals()确实真正的全局命名空间, 所以一般会说
#**********locals() 只读, globals() 可读可写**********
#————以上内容摘自《pthon动态变量命名-Python locals() 的陷阱》
#简单来说吧,就是狗日的给变量动态命名的时候不要用locals()
#命名一律用galobal()!!!!
#至于在查找的时候,为了方便起见(不用看到一大堆眼花缭乱的系统变量),我们倒是可以让locals发挥一下余热。
def print_3():
print('locals():', locals())
for i in range(3):
globals()['a%s'%i] = i**2
#globals()['a{}'.format(i)] = i**2
print(a0, a1, a2)
print(locals())
print(globals())
print_3()
#最后,python内存自动回收,一般而言,不需要显式的来释和内存。如果你实在想的话就del 变量名就行了。
del(a0)
print(globals())