对自由变量的理解

转载 2015年11月18日 15:56:18

转载自:http://www.cnblogs.com/wangfupeng1988/p/3992795.html  建议查看原文 原文中还有其他更为精彩的文章 非常的经典 建议去看


先解释一下什么是“自由变量”。

在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。如下图

如上程序中,在调用fn()函数时,函数体中第6行。取b的值就直接可以在fn作用域中取,因为b就是在这里定义的。而取x的值时,就需要到另一个作用域中取。到哪个作用域中取呢?

有人说过要到父作用域中取,其实有时候这种解释会产生歧义。例如:

 

所以,不要在用以上说法了。相比而言,用这句话描述会更加贴切——要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用”,切记切记——其实这就是所谓的“静态作用域”。

对于本文第一段代码,在fn函数中,取自由变量x的值时,要到哪个作用域中取?——要到创建fn函数的那个作用域中取——无论fn函数将在哪里调用。

 

上面描述的只是跨一步作用域去寻找。寻找时 首先是在当前作用域中寻找 如果未找到 就到创建当前作用域的作用域中找 如果还没找到 则到创建了当前作用域的作用域的作用域中去找 以此类推

如果跨了一步,还没找到呢?——接着跨!——一直跨到全局作用域为止。要是在全局作用域中都没有找到,那就是真的没有了。

这个一步一步“跨”的路线,我们称之为——作用域链

我们拿文字总结一下取自由变量时的这个“作用域链”过程:(假设a是自由量)

第一步,现在当前作用域查找a,如果有则获取并结束。如果没有则继续;

第二步,如果当前作用域是全局作用域,则证明a未定义,结束;否则继续;

第三步,(不是全局作用域,那就是函数作用域)将创建该函数的作用域作为当前作用域;

第四步,跳转到第一步。

 

以上代码中:第13行,fn()返回的是bar函数,赋值给x。执行x(),即执行bar函数代码。取b的值时,直接在fn作用域取出。取a的值时,试图在fn作用域取,但是取不到,只能转向创建fn的那个作用域中去查找,结果找到了。

 

这一节看似很轻松的把作用域链引出来,并讲完了。之所有轻松是有前几节的基础,否则将很难解释。

接下来咱们开始正式说说一直期待依旧的朋友——闭包。敬请期待下一节。


相关文章推荐

求解Ax=0:主变量、自由变量、特殊解

上一篇简单介绍了列空间(column space)和零空间(null space),这一次主要介绍如何求出零空间内的向量,即主要讨论Ax=0。假设有矩阵A= ,略微观察一下其行和列可看出,列2是列1的...

python中的闭包函数与自由变量

什么是闭包? 简单说,闭包就是根据不同的配置信息得到不同的结果 再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变...

从python API中命名和绑定认识局部变量,全局变量,自由变量

4. Execution model 执行模块 4.1. Structure of a program 程序结构 A Python program is constructed from code b...

JS概念理解(三)——执行上下文、作用域与自由变量

执行上下文:         在我的理解中,执行上下文环境是在开始执行代码之前,需要把所有用到的东西拿出来,有的直接赋值,有的先声明出来,下面举例说明;...

python中lambda表达式中自由变量的坑

Python中函数是一个对象, 和整数,字符串等对象有很多相似之处,例如可以作为其他函数的参数或返回对象, Python中的函数还可以携带自由变量, 两者无疑极大增进了Python的表达力. 但...

Rust : 闭包、move 与自由变量的穿越

闭包对进入其中的自由变量而言,有点象黑洞。自由变量进去了,很难再逃脱了。除非,有特别的力量。move,你该上场了,开始你的表演..........
  • wowotuo
  • wowotuo
  • 2017年01月02日 21:22
  • 342

POJ 1753 Flip Game(高斯消元法,枚举自由变元)

题目: Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34731   Accepted: ...

sgu-200 Cracking RSA(简单的高斯消元求自由变元个数)

题目大意: 给你一个t,m,接下来输入m个数a1。。。。am满足ai的质因数包含在前t个质数中 从中取出任意个数,使得乘积为完全平方数,问有多少种取法。 解题思路:...

2016ccpc 1002(hdu5833)题解 (高斯消元求异或方程组自由变元)

比赛结束才知道是个高斯消元的题目,吓得我赶紧学了一发,然后惊讶的发现白皮书上原题QAQ. 由于刚学会,虽然是手敲但有些细节还是比对了模板,所以并不能解释,先放一发代码,等熟练了再补. 代码: #i...

poj 1681 Painter's Problem 【高斯消元 枚举自由变元】

链接:http://poj.org/problem?id=1681 题意:与poj1222相似 输出变为求最小步数。 分析:由于求最小步数,当我们存在自由变元时,我们可以得到解,但是不知道需要的最...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对自由变量的理解
举报原因:
原因补充:

(最多只允许输入30个字)