python locals globals

Python有两个内置的函数,locals() 和globals(),它们提供了基于字典的访问局部和全局变量的方式。 git

首先,是关于名字空间的一个名词解释。是枯燥,可是很重要,因此要耐心些。Python使用叫作名字空间的东西来记录变量的轨迹。名字空间只是一个 字典,它的键字就是变量名,字典的值就是那些变量的值。实际上,名字空间能够象Python的字典同样进行访问,一会咱们就会看到。 函数

在一个Python程序中的任何一个地方,都存在几个可用的名字空间。每一个函数都有着自已的名字空间,叫作局部名字空间,它记录了函数的变量,包括 函数的参数和局部定义的变量。每一个模块拥有它自已的名字空间,叫作全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常 量。还有就是内置名字空间,任何模块都可访问它,它存放着内置的函数和异常。 ui

当一行代码要使用变量 x 的值时,Python会到全部可用的名字空间去查找变量,按照以下顺序: spa

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

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

象Python中的许多事情同样,名字空间在运行时直接能够访问。特别地,局部名字空间能够经过内置的 locals 函数来访问。全局(模块级别)名字空间能够经过 globals 函数来访问 ci

locals 介绍 字符串

1
2
3
4
5
6
7
8
9
10
11
12
>>>  def test(arg):
#函数 foo 在它的局部名字空间中有两个变量:arg(它的值被传入函数),和 z(它是在函数里定义的)。
    z = 1
     print locals()
>>> test(4)
#locals 返回一个名字/值对的字典。这个字典的键字是字符串形式的变量名字,字典的值是变量的实际值。
#因此用 4 来调用 foo,会打印出包含函数两个局部变量的字典:arg (4) 和 z (1)。
{'z': 1, 'arg': 4}
>>> test('doulaixuexi')
#locals 能够用于全部类型的变量。
{'z': 1, 'arg': 'doulaixuexi'}
>>>

globals 介绍 rpc

1
2
3
4
5
6
7
8
9
10
11
12
>>>  from sys  import *
>>>  print globals()
{'setrecursionlimit': <built- in function setrecursionlimit>, 
'dont_write_bytecode': False, 
'getfilesystemencoding': <built- in function getfilesystemencoding>, 
'long_info': sys.long_info(bits_per_digit=15, sizeof_digit=2), 
'stdout': <idlelib.rpc.RPCProxy object at 0x02110850>, 
'text': <function text at 0x02111A70>, 
'meta_path': [], 
'exc_clear': <built- in function exc_clear>, 
'prefix': 'C: \\Python27', 'getrefcount': <built- in function getrefcount
......省略不少

能够发现globals 函数返回一个全局变量的字典,包括全部导入的变量。 get



from module import 和 import module之间的不一样。使用 import module,模块自身被导入,
可是它保持着自已的名字空间,这就是为何你须要使用模块名来访问它的函数或属(module.function)
的缘由。可是使用 from module import,其实是从另外一个模块中将指定的函数和属性导入到你本身的名字空间,这就是为何你能够直接访问它们却不须要引用它们所来源的模块的缘由。
it

相关文章
相关标签/搜索