这是对this question的后续。

  • 为什么在编译时而不是在执行时确定局部性?纯粹是为了性能吗?
  • 是否存在在执行时查找其变量的语言? IE。每次访问变量时,首先在本地作用域中搜索此变量,然后在所有封闭的作用域中扩展搜索?
  • ECMA语言如何处理?

  • 换句话说,问题2:是否存在以下代码(采用必要的语法)可以正常工作的语言:
    def f(): print ('f')
    
    def g():
        f()
        f = 42
    
    g()
    

    最佳答案

    这种行为称为词汇作用域。尽管在口头上的描述具有误导性(您说的是“封闭范围”,其中“调用函数”或“激活记录”会更准确),但您在第二个描述中所描述的被称为动态范围。

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

    词法作用域的基本原理不仅在于性能(包括闭包在内的完整词法作用域实际上具有性能成本,请参见funcarg问题),其原因在于简单性和可靠性。初学该语言可能会令人惊讶,但是规则实际上非常简单,因此经验丰富的程序员可以立即分辨出标识符的使用是指哪个范围。可以孤立地理解函数,因为执行不受谁调用此函数以及他们决定如何命名变量的影响。

    关于python - 为什么在编译时确定位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19064520/

    10-08 23:03