Python中变量的作用域
x = 10 # 全局作用域print(x) # 查找 xexample() # 会输出 10在example函数中,x没有在局部作用域中定义,所以 Python 会按照 LEGB 规则查找,最终会在全局作用域中找到并使用全局变量x。作用域(Scope)定义了变量名在代码中的有效范围。LEGB 规则决定了变量名的查找顺序:首先查找局部作用域,其次查找封闭作用域,再查找全局作用域,最后查找内建作用域
在 Python 中,作用域(Scope) 定义了一个变量或名称可以被访问和使用的范围。Python 的作用域机制是基于 LEGB(Local -> Enclosing -> Global -> Built-in)规则的,这个规则决定了在代码中查找变量名时,Python 的解释器会依次查看各个作用域,直到找到该变量或名称。
Python 作用域的层级(LEGB规则)
-
L (Local) - 局部作用域:
- 这是当前正在执行的函数或方法内的作用域。任何在函数或方法内部定义的变量,都是局部变量,它们只能在该函数或方法内访问。
-
E (Enclosing) - 闭包作用域:
- 如果在一个函数内定义了另一个函数(即内嵌函数),那么内嵌函数可以访问外层函数的局部变量。这种外层函数的作用域被称为闭包作用域。注意,闭包作用域适用于嵌套函数,但不适用于其他的作用域嵌套。
-
G (Global) - 全局作用域:
- 这是在模块级别(文件级别)定义的变量所在的作用域。全局作用域中的变量可以在整个模块内的任何地方访问,只要在访问它们之前,它们已经被定义。
-
B (Built-in) - 内建作用域:
- 这是 Python 内部预定义的所有内建名字的作用域,例如
print()
、len()
、int()
等内建函数和类型。在 Python 程序中,任何地方都可以访问这些内建对象。
- 这是 Python 内部预定义的所有内建名字的作用域,例如
LEGB 查找顺序
当你在 Python 中使用一个变量时,解释器会按以下顺序查找该变量:
- 局部作用域(L):首先查找当前函数或方法的局部作用域。
- 闭包作用域(E):如果在当前作用域找不到,则查找封闭函数的作用域。
- 全局作用域(G):如果仍然没有找到,则查找模块级别的作用域。
- 内建作用域(B):最后,如果仍然找不到,就查找 Python 的内建命名空间。
示例:作用域和 LEGB 规则
# 全局作用域
x = 10
def outer_function():
# 闭包作用域
x = 20
def inner_function():
# 局部作用域
x = 30
print(x) # 局部作用域中的 x
inner_function()
print(x) # 闭包作用域中的 x
outer_function()
print(x) # 全局作用域中的 x
输出:
30 # 来自 inner_function 的局部作用域
20 # 来自 outer_function 的闭包作用域
10 # 来自全局作用域
解释:
- 在
inner_function()
中,x = 30
是局部作用域中的变量,因此打印出30
。 - 在
outer_function()
中,x = 20
属于闭包作用域。由于inner_function()
执行完毕后,打印x
会看到的是outer_function
作用域中的变量x
,即20
。 - 在
outer_function()
外部,x = 10
是全局作用域中的变量,最后打印全局作用域中的x
值,即10
。
关键点:
- 局部作用域优先级最高,在当前函数中首先查找。
- 闭包作用域优先于全局作用域。
- 全局作用域优先级次之,模块级别的变量可以在整个模块中访问。
- 内建作用域的优先级最低,包含 Python 内建的名称。
注意事项:
- 函数参数也是局部变量,属于局部作用域的一部分。
- 如果变量名在一个作用域中被赋值(例如局部变量),那么在该作用域中访问这个变量时,Python 会优先查找局部作用域中的值。如果没有赋值,Python 会查找外层作用域。
示例:未定义的变量查找
x = 10 # 全局作用域
def example():
print(x) # 查找 x
example() # 会输出 10
在 example
函数中,x
没有在局部作用域中定义,所以 Python 会按照 LEGB 规则查找,最终会在全局作用域中找到并使用全局变量 x
。
总结
- 作用域(Scope) 定义了变量名在代码中的有效范围。
- LEGB 规则 决定了变量名的查找顺序:首先查找局部作用域,其次查找封闭作用域,再查找全局作用域,最后查找内建作用域。
- Python 中的作用域机制使得变量的访问更加灵活和高效,同时也避免了命名冲突和混乱。

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)