这是this question的后续行动。
换句话说换问题2:是否存在以下代码(使用必要语法)的语言:
def f(): print ('f')
def g():
f()
f = 42
g()
答案 0 :(得分:5)
此行为称为词法作用域。您在#2中描述的内容称为动态范围,但口头描述具有误导性(您说“封闭范围”,其中“调用函数”或“激活记录”将更准确)。
几乎常用的每种语言都使用词法作用域,而不仅仅是Python。这包括C#和ECMAScript / JavaScript(禁止eval
和with
),我认为这是“ECMA语言”的意思。有语言,其中一些仍在使用。 Emacs Lisp是一个,Perl提供词法和动态范围。
有词法作用域的理由是不只是性能(全词法作用域包括封闭件实际上具有一个性能成本见funcarg问题),这是为了简化和可靠性。虽然在第一次学习语言时可能会令人惊讶,但规则实际上很简单,因此有经验的程序员可以立即知道标识符的哪个用途指的是哪个范围。人们可以孤立地理解函数,因为执行不受调用此函数的人以及他们如何决定命名他们的变量的影响。