这是对这个问题的一个后续行动.
换句话说,问题2是:是否存在以下代码(在必要的语法中)起作用的语言:
def f(): print ('f')
def g():
f()
f = 42
g()
Run Code Online (Sandbox Code Playgroud)
小智 5
此行为称为词法作用域.您在#2中描述的内容称为动态范围,但口头描述具有误导性(您说"封闭范围",其中"调用函数"或"激活记录"将更准确).
实际上,每种常用语言都使用词法范围,而不仅仅是Python.这包括C#和ECMAScript/JavaScript(禁止eval和with),我假设你是"ECMA语言"的意思.有语言,其中一些仍在使用.Emacs Lisp是其中之一,Perl提供词法和动态范围.
词法范围的基本原理不仅仅是性能(完整的词法范围包括闭包实际上有性能成本,请参见funcarg问题),这是为了简单和可靠.虽然在第一次学习语言时可能会令人惊讶,但规则实际上很简单,因此有经验的程序员可以立即知道标识符的哪个用途指的是哪个范围.人们可以理解的隔离功能,执行不受谁调用此功能,以及它们如何决定命名他们的变量.