这是对this question的后续。
换句话说,问题2:是否存在以下代码(采用必要的语法)可以正常工作的语言:
def f(): print ('f')
def g():
f()
f = 42
g()
最佳答案
这种行为称为词汇作用域。尽管在口头上的描述具有误导性(您说的是“封闭范围”,其中“调用函数”或“激活记录”会更准确),但您在第二个描述中所描述的被称为动态范围。
几乎每种常用的语言都使用词法作用域,而不仅仅是Python。其中包括C#和ECMAScript/JavaScript(禁止eval
和with
),我认为这就是您所说的“ECMA语言”。已经有语言,其中一些仍在使用中。 Emacs Lisp是其中之一,Perl提供了词汇和动态作用域。
词法作用域的基本原理不仅在于性能(包括闭包在内的完整词法作用域实际上具有性能成本,请参见funcarg问题),其原因在于简单性和可靠性。初学该语言可能会令人惊讶,但是规则实际上非常简单,因此经验丰富的程序员可以立即分辨出标识符的使用是指哪个范围。可以孤立地理解函数,因为执行不受谁调用此函数以及他们决定如何命名变量的影响。
关于python - 为什么在编译时确定位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19064520/