在Python中,作用域(Scope)定义了变量、函数和类的可见性和访问规则。它决定了在代码的哪些部分可以访问或修改这些实体。Python中的作用域主要分为以下几种:
全局作用域(Global Scope):
- 全局作用域是在代码中任何函数、类或语句块之外定义的变量和函数的作用域。
- 在全局作用域中定义的变量可以在代码的任何位置访问,只要它们没有被局部变量覆盖。
- 全局作用域在程序执行时创建,在程序执行结束时销毁。
局部作用域(Local Scope):
- 局部作用域是在函数或语句块(如if、for、while等,但注意这些语句块本身不引入新作用域,它们的作用域由包含它们的函数或全局作用域决定)内部定义的变量和函数的作用域。
- 在局部作用域中定义的变量只能在所在的函数或语句块内部访问。
- 函数每次调用时都会创建一个新的局部作用域,这意味着同一函数在不同时间运行其作用域是相互独立的。
嵌套作用域(Enclosing Scope 或 Nonlocal Scope):
- 嵌套作用域是指在一个函数内部定义的另一个函数(即嵌套函数)可以访问其外部函数中的变量。
- 内部函数可以访问其直接外层函数(即封闭函数)中的局部变量,但不能访问更外层函数的变量,除非通过其他方式(如全局变量或参数传递)进行访问。
- Python 2.x 中没有正式的“nonlocal”关键字,但 Python 3.x 引入了它,允许在嵌套函数中声明对封闭作用域中变量的非局部绑定。
内置作用域(Built-in Scope):
- 内置作用域是Python内置的函数和变量的作用域。
- 它包含了Python解释器启动时自动加载的内置模块和函数,如
len()
、print()
等。 - 内置作用域中的函数和变量可以在程序的任何地方被访问,无需导入任何模块。
在Python中,作用域对象是一个存储变量和函数名称与其对应值的字典。它用于存储当前作用域中的变量和函数,并提供对这些名称和值的访问和操作。每个作用域都有一个关联的作用域对象,可以通过locals()
函数(获取当前局部作用域的对象)或globals()
函数(获取当前全局作用域的对象)来获取。
此外,当使用某一变量时,Python解释器会按照“就近原则”在作用域链中查找该变量:首先在当前作用域(局部作用域)中查找,如果找不到则到上一层作用域(嵌套作用域)中查找,再找不到则到全局作用域中查找,最后到内置作用域中查找。如果在所有作用域中都找不到该变量,则会抛出NameError
异常。