变量的作用域决定了变量的可访问性和生命周期。
作用域规定了在何处可以访问一个变量以及该变量何时被销毁。
Python中有四种主要的作用域类型:
1. 局部作用域 (Local Scope)
- 局部变量是在函数内部定义的变量。
- 这些变量只能在定义它们的函数内部访问。
- 函数执行完毕后,局部变量会被销毁。
2. 封闭作用域 (Enclosing Scope)
- 当一个函数内嵌在另一个函数中时,内层函数可以访问外层函数的变量。
- 这种作用域称为封闭作用域。
- 在Python 3中,可以通过`nonlocal`关键字来修改封闭作用域中的变量。
3. 全局作用域 (Global Scope)
- 全局变量在整个程序的顶层定义,可以在任何地方访问(除了函数的局部作用域,除非使用`global`关键字)。
- 使用`global`关键字可以在函数内部声明或修改全局变量。
# 定义全局变量a
a = 100
def testA():
print(a) # 访问全局变量a,并打印变量a存储的数据
def testB():
print(a) # 访问全局变量a,并打印变量a存储的数据
4. 内置作用域 (Built-in Scope)
- 内置作用域包含了Python自带的所有函数和模块。
- 这些名称可以直接在程序中使用,无需导入。
下面是一个简单的例子来说明这些作用域的概念:
x = "global x" # 全局变量
def outer():
y = "enclosing y" # 封闭作用域变量
def inner():
nonlocal y # 使用nonlocal关键字访问封闭作用域的y
z = "local z" # 局部作用域变量
print(z) # 访问局部变量z
print(y) # 访问封闭作用域变量y
print(x) # 访问全局变量x
y = "modified y" # 修改封闭作用域变量y
inner()
print(y) # 输出修改后的y值
outer() # 调用外层函数
print(x) # 输出全局变量x
在这个例子中:
- `x` 是一个全局变量。
- `y` 是一个封闭作用域变量,在`outer`函数中定义。
- `z` 是一个局部变量,在`inner`函数中定义。
- 使用`nonlocal y`允许我们在`inner`函数中修改`outer`函数中的`y`。
需要注意的是,Python使用LEGB规则来解析变量名:
1. Local (局部作用域)
2. Enclosing (封闭作用域)
3. Global (全局作用域)
4. Built-in (内置作用域)
这意味着当Python解释器查找一个变量时,它会按照这个顺序从最内层向外层搜索,直到找到变量为止。如果在所有这些作用域中都找不到变量,则会引发`NameError`异常。