学习装饰器前,我们先了解三个概念:作用域、函数(嵌套)、闭包。
作用域简单说就是一个变量的命名空间。代码中变量被赋值的位置,就决定了哪些范围的对象可以访问这个变量,这个范围就是命名空间。python赋值时生成了变量名,当然作用域也包括在内。
在函数外,一段代码最始开所赋值的变量,它可以被多个函数引用,这就是全局变量;
在函数内定义的变量名,只能被函数内部引用,不能在函数外引用这个变量名,这个变量的作用域就是局部的,也叫它为局部变量 ;
如果函数内的变量名与函数外的变量名相同,也不会发生冲突。
x = 66 def func(): x = 88
x = 66这个赋值语句所创建的变量X,作用域为全局变量;
x = 88这个赋值语句所创建的变量X,它的作用域则为局部变量,只能在函数func()内使用。
尽管这两个变量名是相同的,但它的作用域为它们做了区分。作用域在某种程度上也可以起到防止程序中变量名冲突的作用。
在 Python 函数中会创建一个新的作用域。也就是说,当在函数体中遇到变量时,Python 会首先在该函数的命名空间中寻找变量名。Python 有几个函数用来查看命名空间。下面来写一个简单函数来看看局部变量和全局变量的区别。
>>> a_string = "This is a global variable" >>> def foo(): ... print locals() ... >>> print globals() {‘__builtins__‘: <module ‘__builtin__‘ (built-in)>, ‘a_string‘: ‘This is a global variable‘, ‘__package__‘: None, ‘__name__‘: ‘__main__‘, ‘foo‘: <function foo at 0x00000000022DDAC8>, ‘__doc__‘: None} >>> foo() {}
内建函数 globals 返回一个包含所有 Python 能识别变量的字典。
调用了 foo 函数,在函数中打印局部变量的内容。从中可以看到,函数 foo 有自己单独的、此时为空的命名空间。
总结:
1、变量的作用域由代码被赋值的位置所决定
2、变量可以在3个不同地方,对应3种不同作用域:
原文:http://www.cnblogs.com/shhnwangjian/p/6305750.html