Locals && Globals
python的变量命名空间。
python跟绝大多数语言一样拥有相同的变量作用域概念,在代码中决定变量的真是适用范围靠的就是一套命名空间dictionary。
命名空间记录着变量的轨迹,它的键字就是变量名,它的值就是那些变量的值。名字空间可以象 Python 的 dictionary 一样进
行访问。
在一个 Python 程序中的任何一个地方,都存在几个可用的名字空间。每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间,任何模块均可访问它,它存放着内置的函数和异常。
当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。
全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,同时传 递 There is no variable named 'x' 这样一条信息。
举例子
locals 介绍
>>> def foo(arg): ... x = 1 ... print locals() ... >>> foo(7) {'arg': 7, 'x': 1} >>> foo('bar') {'arg': 'bar', 'x': 1}
globals 注意事项
for i,k in globals(),items():
print (i,k)
各位同仁大家也许在打印print globals() 的时候会报错
RuntimeERROR:dictionary changed size during iteration。
这个错误其实就是因为变量 i,k 引发。列表解析是将i,k派生出来因为没有事先的声明,所以
这两个变量属全局变量。因此在迭代globas()时才会引发错误 。
好事多磨
还没有评论,来说两句吧...