本文作者:标题

DrakNight_python日志2016/12/28

标题 4周前 ( 03-23 10:01 ) 抢沙发

Locals && Globals

    python的变量命名空间。

python跟绝大多数语言一样拥有相同的变量作用域概念,在代码中决定变量的真是适用范围靠的就是一套命名空间dictionary。

命名空间记录着变量的轨迹,它的键字就是变量名,它的值就是那些变量的值。名字空间可以象 Python 的 dictionary 一样进

行访问。

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


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

  1. 局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x, 或一个参数 xPython 将使用它,然后停止搜索。

  2. 全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。

  3. 内置名字空间 - 对每个模块都是全局的。作为最后的尝试,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()时才会引发错误 。






好事多磨


文章版权及转载声明

作者:标题本文地址:https://www.meiriyixue.cn/post/146.html发布于 4周前 ( 03-23 10:01 )
文章转载或复制请以超链接形式并注明出处每日一学网

分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,人围观)参与讨论

还没有评论,来说两句吧...