试图了解功能和范围问题

时间:2019-04-15 19:32:29

标签: python

我刚刚开始学习python,但我对python如何处理作用域感到有些困惑。我知道全局,封闭和局部变量在哪里(至少我认为我是:D)。 我在学习Python第5版中阅读了以下段落:

  

当在函数中使用非限定名称时,Python最多搜索四个范围-本地(L)范围,然后是任何封闭(E)def和lambda的本地范围,然后是全局(G)范围,以及然后是内置(B)范围-并停在第一个找到该名称的位置。如果在此搜索过程中未找到名称,Python将报告错误。 (第448页)

现在我不明白为什么示例1有效,而示例2无效。

示例1

def box2():
    def box1():
        total = price + tip
        print(total)
    price = 1
    tip = 1
    box1()
box2()

示例2

def box1():
    total = price + tip
    print(total)

def box2():
    price = 1
    tip = 1
    box1()
box2()

谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

该段的重要内容是:

  

Python搜索...任何封闭的(E)defs的本地范围...

“包含”是指它的定义位置:

  • 在示例1中,box1被定义为内部 box2(即在box2的范围内),因此box2是一个封闭范围的box1
  • 在示例2中,box1被定义为外部 box2(即在box2范围内不是),因此{ {1}} 不是封闭范围的box2

应归功于UnholySheepBarmar,尤其是juanpa.arrivillaga,因为在评论中解释得很好