如何理解使用Python代码的动态作用域?

2024-06-16 14:03:12 发布

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

我是一名程序员,来自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代码中的动态作用域吗?在


Tags: 函数代码inreturn定义foomainbar
1条回答
网友
1楼 · 发布于 2024-06-16 14:03:12

Python中没有动态作用域,除非您implement your own stack-based 'namespace'。在

是的,动态范围界定就是这么简单;变量的值由最近的调用namespace决定,其中设置了一个值。将调用视为堆栈,并通过从上到下搜索当前调用堆栈来查找值。在

因此,对于动态示例,堆栈是第一个:

foo
main 
globals -> b = 5

在堆栈中搜索时查找b = 5,然后堆栈更改为

^{pr2}$

因此找到b = 2。在

相关问题 更多 >