我是一名程序员,来自Python背景,通常使用词法范围,我想了解动态范围。我在网上查过了,还不清楚。例如,我读过this page,它使我的工作变得容易得多,尤其是代码片段:
#In Dynamic scoping:
const int b = 5;
int foo()
{
int a = b + 5;
return a;
}
int bar()
{
int b = 2;
return foo();
}
int main()
{
foo(); // returns 10
bar(); // returns 7
return 0;
}
#In lexical scoping:
const int b = 5;
int foo()
{
int a = b + 5;
return a;
}
int bar()
{
int b = 2;
return foo();
}
int main()
{
foo(); // returns 10
bar(); // returns 10
return 0;
}
正如我所理解的,正如您所看到的,在动态作用域中,bar
函数返回7而不是10,这意味着foo
调用了在bar
中定义的b
变量,换句话说,foo
没有查找在代码顶部定义的b
变量,而是使用了b
变量在bar
中定义。在
Q1:因此,在动态范围中,在本例中的另一个函数中被调用的函数foo
首先在bar
中调用的调用函数中查找变量,然后查找顶层变量?在
问题2:你能解释一下Python代码中的动态作用域吗?在
Python中没有动态作用域,除非您implement your own stack-based 'namespace'。在
是的,动态范围界定就是这么简单;变量的值由最近的调用namespace决定,其中设置了一个值。将调用视为堆栈,并通过从上到下搜索当前调用堆栈来查找值。在
因此,对于动态示例,堆栈是第一个:
在堆栈中搜索时查找
^{pr2}$b = 5
,然后堆栈更改为因此找到
b = 2
。在相关问题 更多 >
编程相关推荐