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