如何使用Python代码理解动态范围?

时间:2015-09-21 15:47:28

标签: python scope

我是来自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代码中的动态作用域吗?

1 个答案:

答案 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