Skip to main content
 首页 » 编程设计

python之如何使用 Python 代码理解动态作用域

2025年05月04日31lautakyan007

我是一名来自 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。