Python的全局变量和局部变量详解——locals 和globals两个函数

我们先看如下代码:

 
  
 
  
a_string = "This is a global variable"
gender = 'Male'


def foo():
    name = 'alien'
    print(locals())            #打印当前区域的  局部变量


foo()
print('='*30)
print(globals())               # 打印当前区域的 全局变量

  • {'name': 'alien'}
  • ==============================
  • {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x101cbdc50>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/test/untitled/Myderactor.py', '__cached__': None, 'a_string': 'This is a global variable',   'gender': 'Male', 'foo': }

相信即使是初学者也知道,my_string 这个变量是出全局变量,name这个变量是局部变量,但是大部分人初学者不知道的是,这些变量都从哪里来的吗?程序怎么知道去哪里寻找和调用这些变量的呢?

1.通过上面的问题,我们引入了2个函数locals()以及globals()的概念

(1)在理解这两个函数时,首先来理解一下python中的名字空间概念。Python使用叫做名字空间的 东西来记录变量的轨迹。名字空间只是一个字典,它的键字key就是变量名,字典的值value就是那些变 量的值。实际上,名字空间可以象Python的字典一样进行访问
(2)每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数

和局部定义的变量。

(3)每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。

(4)还有就是内置名字空间,任何模块均可访问它,它存放着内置的函数和异常。


2.当一行代码要使用变量 x 的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:

(1)局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用 这个变量,然后停止搜索。
(2)全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用这个变量然后停止搜索。
(3)内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python将假设 x 是内置函数或变量。

备注:

如果Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 的异常,同时传递There is no variable named 'x' 这样一条信息。


文章来源:

http://www.cnblogs.com/wanxsb/archive/2013/05/07/3064783.html


你可能感兴趣的:(Python基础)