本节内容针对所用语言,而非专指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
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
~~~
- 前言
- Python编程规范
- 编码
- 代码
- 缩进、行宽、引号、空行
- 空格
- 换行
- import
- 注释
- 代码注释
- 文档注释(Docstring)
- 命名规范
- 数据结构
- 变量
- 变量作用域
- 命名空间
- 作用域
- python作用域
- 对象
- 序列
- 可迭代对象
- 迭代器
- 生成器
- 可迭代对象 & 迭代器 & 生成器
- 整数池 & 字符串intern
- 数据类型
- 数字
- int
- float
- NaN
- 四舍五入 & 取整
- 列表
- 元组
- 字典
- 集合
- 字符串
- 字符集&字符编码
- 字符串&字节串
- 字符串函数
- 字符串格式化
- str.format
- Formatted string literals
- format函数
- string.Formatter类
- %
- Format String Syntax
- Format Specification Mini-Language
- fill
- align
- sign
- #
- 0
- width
- grouping_option
- .precision
- type
- locale
- Python3 locale 模块
- 语句
- 运算符
- if/else
- for...in
- while
- break/continue
- 函数
- 函数
- 函数参数
- 递归函数
- 匿名函数
- 高阶函数
- map
- reduce
- filter
- sorted
- 返回函数
- 闭包
- 装饰器
- 函数装饰器
- 带参数的装饰器
- 类装饰器
- 带参数的类装饰器
- 偏函数
- 面向对象
- 类 & 实例
- 属性
- 方法
- 访问限制
- 继承
- 新式类 & 经典类
- MRO
- MixIn
- 模块
- 特殊变量
- 编写模块
- 引入 & 重载
- 搜索模块
- 第三方模块
- 常见模块
- 标准库
- os
- sys
- datetime
- re
- urllib
- time/datetime
- threading
- multiprocessing
- builtins
- help
- range
- enumerate
- 异同
- str() repr() ascii()
- exit()、sys.exit()、os._exit()
- 数据库
- mysql
- 错误、调试、测试
- 异常
- 异常处理
- 自定义异常
- 抛出异常
- 调试
- logging
- pdb
- 线程&&进程
- 线程
- 杂
- python 脚本传参
- python无关
- redis
- mongo
- linux
- mysql简略