为什么在编译时确定局部性?

时间:2013-09-28 07:27:17

标签: python scope

这是this question的后续行动。

  1. 为什么在编译时确定局部性而不是在执行时?这纯粹是为了表现吗?
  2. 是否有语言在执行时查找变量?即每次访问变量时,首先在本地范围内搜索此变量,然后搜索会在所有封闭范围内升级吗?
  3. ECMA语言如何处理此问题?
  4. 换句话说换问题2:是否存在以下代码(使用必要语法)的语言:

    def f(): print ('f')
    
    def g():
        f()
        f = 42
    
    g()
    

1 个答案:

答案 0 :(得分:5)

此行为称为词法作用域。您在#2中描述的内容称为动态范围,但口头描述具有误导性(您说“封闭范围”,其中“调用函数”或“激活记录”将更准确)。

几乎常用的每种语言都使用词法作用域,而不仅仅是Python。这包括C#和ECMAScript / JavaScript(禁止evalwith),我认为这是“ECMA语言”的意思。有语言,其中一些仍在使用。 Emacs Lisp是一个,Perl提供词法和动态范围。

有词法作用域的理由是不只是性能(全词法作用域包括封闭件实际上具有一个性能成本见funcarg问题),这是为了简化和可靠性。虽然在第一次学习语言时可能会令人惊讶,但规则实际上很简单,因此有经验的程序员可以立即知道标识符的哪个用途指的是哪个范围。人们可以孤立地理解函数,因为执行不受调用此函数的人以及他们如何决定命名他们的变量的影响。