我是一名来自 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 在 bar 中定义的变量,换句话说,foo 没有查找在代码顶部定义的 b 变量(第一个 b 变量),而是使用 bar 中定义的 b 变量。
Q1:因此,在动态作用域中,在这种情况下,在另一个函数内调用的函数 foo 在 bar 中调用,首先在此调用函数中查找变量case bar 然后它寻找顶级变量?
问题 2:您能解释一下 Python 代码中的动态作用域吗?
请您参考如下方法:
Python 中没有动态作用域,除非你 implement your own stack-based 'namespace' .
是的,动态范围就是这么简单;变量的值由设置值的最近的调用命名空间确定。将调用视为堆栈,并通过从上到下搜索当前调用堆栈来查找值。
因此对于您的动态示例,堆栈在前:
foo
main
globals -> b = 5
查找栈时发现b = 5,然后栈变为
foo
bar -> b = 2
main
globals -> b = 5
所以找到b = 2。
