Python 试图理解函数和范围问题

Python 试图理解函数和范围问题,python,Python,我刚开始学习python,我对python如何处理作用域感到有点困惑。我了解全局变量、封闭变量和局部变量的位置(至少我认为我了解:D)。 我在Learn Python第5版中阅读了以下段落: 当在函数中使用非限定名称时,Python将搜索多达四个作用域—本地(L)作用域,然后是任何封闭(E)def和lambda的本地作用域,然后是全局(G)作用域,然后是内置(B)作用域—并在找到名称的第一个位置停止。如果在此搜索过程中未找到该名称,Python将报告一个错误。(第448页) 现在我不明白为什么示

我刚开始学习python,我对python如何处理作用域感到有点困惑。我了解全局变量、封闭变量和局部变量的位置(至少我认为我了解:D)。 我在Learn Python第5版中阅读了以下段落:

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

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

例1
def box2():
def box1():
总计=价格+小费
打印(总计)
价格=1
小费=1
框1()
框2()
例2
def box1():
总计=价格+小费
打印(总计)
def box2():
价格=1
小费=1
框1()
框2()

谢谢您的时间。

这一段的重点是:

Python搜索。。。包含(E)定义的任何的局部范围

“封闭”是指其定义:

  • 在示例1中,
    box1
    box2
    内部定义(即在
    box2
    的范围内),因此
    box2
    box1
    的封闭范围
  • 在示例2中,
    box1
    是在
    box2
    之外定义的(即不是
    box2
    范围内的),因此
    box2
    不是
    box1
    的封闭范围

值得赞扬的是,尤其是在评论中对其进行了很好的解释,因为
box2
不被视为
box1
的封闭范围-它是一个完全独立的范围。范围基于词汇封闭,而不是调用顺序。这是为什么?它不是在box2()的内部调用的,所以它是在它的范围内调用的吗?@Adam它在哪里调用并不重要,重要的是它在哪里定义。在示例2中,box1是在全局范围内定义的,它没有来自另一个函数的任何封闭范围,因为它没有在另一个函数的范围内定义。