Python的作用域规则决定了变量在代码中的可见性和访问性。全局作用域中定义的变量可以在整个程序中访问,而局部作用域中定义的变量则只能在其被创建的函数或代码块中访问。
全局作用域与局部作用域
全局作用域中的变量通常在程序的顶层定义,可以被整个程序的任意部分访问。例如:
global_var = 10 # 全局变量
def my_function():
print(global_var) # 可以访问全局变量global_var
my_function()
print(global_var) # 也可以在函数外部访问
局部作用域则是在函数内部定义的作用域,变量只在函数内部可见,函数外部无法访问。例如:
def my_function():
local_var = 20 # 局部变量
print(local_var)
my_function()
print(local_var) # 这里会报错,因为local_var不在这个作用域内
函数作用域与嵌套作用域
在Python中,函数作用域指的是函数内部定义的作用域,函数参数和局部变量都属于函数作用域。例如:
def outer_function():
outer_var = 30 # outer_var是外部函数的局部变量
def inner_function():
inner_var = 40 # inner_var是内部函数的局部变量
print(outer_var) # 内部函数可以访问外部函数的变量
inner_function()
print(inner_var) # 这里会报错,因为inner_var不在outer_function的作用域内
outer_function()
嵌套作用域是指函数内部可以再定义函数,每个内部函数都可以访问其外部函数的变量。这种结构形成了一个作用域的层次结构,内部作用域可以访问外部作用域的变量,但反之则不行。
LEGB规则:变量查找顺序
Python中变量的查找顺序遵循LEGB规则:
- Local(局部):在当前函数内部查找。
- Enclosing function locals(外部嵌套函数的局部):在包含当前函数的外部函数内部查找。
- Global module(全局模块):在全局作用域内查找。
- Built-in(内置模块):在Python内置的命名空间中查找。
例如:
x = 'global'
def outer():
x = 'outer local'
def inner():
x = 'inner local'
print(x) # 首先在内部函数的局部作用域找到x
inner()
print(x) # 然后在外部函数的局部作用域找到x
outer()
print(x) # 最后在全局作用域找到x