我是来自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
调用b
变量,该变量在{{1}中定义换句话说,bar
没有查找在代码顶部定义的foo
变量(第一个b变量),而是使用了b
中定义的b
变量bar
。
Q1:因此,在动态作用域中,在foo
中调用的另一个函数中调用的函数bar
首先在调用函数中查找变量bar
然后它寻找顶级变量?
Q2:你能解释一下Python代码中的动态作用域吗?
答案 0 :(得分:4)
Python中没有动态范围,除非你implement your own stack-based 'namespace'。
是的,动态范围很简单;变量的值由最接近的调用命名空间确定,其中设置了值。将调用视为堆栈,并通过从上到下搜索当前调用堆栈来查找值。
因此,对于动态示例,堆栈是第一个:
foo
main
globals -> b = 5
在搜索堆栈时找到b = 5
,然后堆栈变为
foo
bar -> b = 2
main
globals -> b = 5
所以找到b = 2
。