不管什么语言,我们总要学习作用域(或生命周期)的概念,比如常见的称呼:全局变量、包变量、模块变量、本地变量、局部变量等等。不管如何称呼这些作用域的范围,实现它们的目的都一样:
- (1)为了避免名称冲突;
- (2)为了限定变量的生命周期(本文以变量名说事,其它的名称在规则上是一样的)。
但是不同语言的作用域规则不一样,虽然学个简单的基础就足够应用,因为我们有编程规范:(1)尽量避免名称冲突;(2)加上类似于local的修饰符尽量缩小生效范围;(3)放进代码块,等等。但是真正去细心验证作用域的生效机制却并非易事(我学Python的时候,花了很长时间细细验证,学perl的时候又花了很长时间细细验证),但可以肯定的是,理解本文的词法作用域规则(Lexical scoping)和动态作用域规则(dynamic scoping),对学习任何语言的作用域规则都有很大帮助,这两个规则是各种语言都宏观通用的。
很简单的一段bash下的代码:
1 x=1
2 function g(){ echo "g: $x" ; x=2; }
3 function f(){ local x=3 ; g; echo "f: $x"; } # 输出2还是3
4 f # 输出1还是3?
5 echo $x # 输出1还是2?
我是一名python开发工程师,整理了一套python的学习资料,从基础的python脚本到web开发、爬虫、
数据分析、数据可视化、机器学习、面试真题等。想要的可以进群:688244617免费领取
对于bash来说,上面输出的分别是3(g函数中echo)、2(f函数中的ec