合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
本节内容针对所用语言,而非专指python 定义 ---- 作用域是针对变量而言,指申明的变量在程序里的可应用范围。或者称为变量的可见性。 我理解为: 命名空间是实体化的数据结构,作用域是查找变量的规则。 块作用域 ----------- 在 java、c 等高级语言中都有块级作用域的概念,如:在 if,for 等语句内定义的变量,在语句之外是不能访问的。 ~~~ ----------c------- #include <stdio.h> int main () { if(1){ int a = 1; printf("%d", a); // 1 } printf("%d", a); // 报错! return 0; } ~~~ php、javascript、python等均无块级作用域: ~~~ ----------js------- for(var i=0; i<5; i++){ console.log(i) // 1 2 3 4 } console.log(i) // 5 ~~~ ~~~ ----------php------- for($i=0; $i<5; $i++){ echo $i; // 01234 } echo $i; // 5 $foo = array('a', 'b', 'c'); foreach($foo as $k=>$v){ echo $k.'--'.$v.' '; // 0--a 1--b 2--c } echo $k, $v; // 2c ~~~ 静态作用域 & 动态作用域 -------------------------- 静态作用域(词法作用域):作用域在词法解析阶段即确定 动态作用域:作用域在程序执行期间动态确定 1) 绝大多数语言均采用 静态作用域规则。仅个别语言采用 动态作用域规则,如:APL、Snobol、Lisp、。 3) 采用 静态作用域 的语言中,基本都是 最内嵌套作用域规则。 4) 许多采用静态作用域的语言,会在个别情况下使用动态作用域。如: - php: 在use变量加上`&`引用时使用动态作用域 - js:this的机制其实就相当于动态作用域,eval 和 with可以产生动态作用域的效果。 2) 动态作用域 在写程序中太容易出错了。 ~~~ # js 采用静态作用域 var foo=1; function static(){ alert(foo); } !function(){ var foo=2; static(); }(); 作者:杨志 链接:https://www.zhihu.com/question/20032419/answer/13742892 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ~~~