为什么在编译时确定位置?

2024-05-18 08:44:46 发布

您现在位置:Python中文网/ 问答频道 /正文

这是对this question的一点补充。你知道吗

  1. 为什么局部性是在编译时确定的而不是在执行时确定的?纯粹是为了表演吗?你知道吗
  2. 有没有在执行时查找变量的语言?也就是说,每次访问一个变量时,首先在本地范围内搜索该变量,然后在所有封闭范围内升级搜索?你知道吗
  3. ECMA语言如何处理这个问题?你知道吗

换言之,提出问题2:是否有以下代码(以必要的语法)适用的语言:

def f(): print ('f')

def g():
    f()
    f = 42

g()

Tags: 代码语言def语法thisquestionprintecma
1条回答
网友
1楼 · 发布于 2024-05-18 08:44:46

这种行为称为词汇范围界定。您在#2中描述的内容称为动态作用域,尽管口头描述有误导性(您所说的“封闭作用域”中的“调用函数”或“激活记录”更准确)。你知道吗

几乎所有常用的语言都使用词法范围,而不仅仅是Python。这包括C#和ECMAScript/JavaScript(除了evalwith),我想这就是你所说的“ECMA语言”的意思。语言已经出现,其中一些还在使用。emacslisp就是其中之一,Perl提供了词法和动态范围。你知道吗

词法作用域的基本原理不仅仅是为了性能(包括闭包在内的完整词法作用域实际上有一个性能成本,请参见funcarg问题),而是为了简单性和可靠性。当第一次学习这种语言时,可能会感到惊讶,但规则实际上非常简单,因此有经验的程序员可以立即判断标识符的哪个用法是指哪个作用域。人们可以孤立地理解函数,因为执行不受调用函数的人和他们决定如何命名变量的影响。你知道吗

相关问题 更多 >