python学习笔记——python动态变量命名-locals()和globals()

#-*- 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())

你可能感兴趣的:(python)