Python作用域详解:LEGB规则与变量查找机制

叶初
叶初
发布时间:2026-10-12 | 2人浏览过
原创

本文深入解析Python中的作用域机制,详细阐述LEGB(Local、Enclosed、Global、Built-in)规则。通过代码示例说明全局、局部、嵌套及内建作用域的生成与查找顺序,帮助开发者避免变量命名冲突,理解变量在不同层级间的可见性与访问权限。

作用域,简而言之,是指变量或函数能够被访问的有效范围。

对于自学者而言,当学习进度推进到函数部分时,理解Python的作用域机制至关重要。若忽视这一点,可能会像许多初学者一样,因混淆函数内外同名变量的值而感到困惑。

本文将基于现有知识,总结Python中作用域的基本形态,并重点解析LEGB规则的具体定义与运作方式。

全局作用域(Global)的生成机制:

在Python中,创建一个.py文件即定义了一个模块,同时也确立了一个作用域。这个覆盖整个模块的范围被称为全局作用域(Global)。

例如,创建一个名为demo.py的文件。

在该文件中声明一个变量,如bd="百度"。

此时,变量bd即被定义为全局变量。

bd="百度"

if True:
  print(bd)
#==============
def function_1():
  print(bd)
function_1()

该全局变量bd既可以在函数外部直接使用,也可以在函数内部被访问。

局部作用域(Local)的生成机制:

当函数被定义时,便产生了一个仅属于该函数的局部空间。在此空间内可以定义变量或嵌套其他函数,这一范围称为局部作用域(Local)。局部作用域内的变量仅能在该函数内部使用。

def locals():
  x=100
  print("local_x = ",x+20)
locals()

代码输出结果为:local_x = 120

若尝试在全局作用域中打印局部变量x,程序将报错:

def locals():
  x=100
  print("local_x = ",x+20
print(x)

错误提示为:NameError: name 'x' is not defined(名称错误:未定义名称 'x')。

这表明局部变量x仅在定义它的函数内部有效,在函数外部调用会导致错误。

嵌套作用域(Enclosed)的生成机制:

当函数发生嵌套时,会产生介于全局和局部之间的嵌套作用域(Enclosed)。

例如,若一个函数内部嵌套了另一个函数,外层函数的作用域即为嵌套作用域,而内层函数的作用域为局部作用域。若存在多层嵌套,则会产生多层嵌套作用域。

x=20
def local_out():
  y=30
  def local_in():
    z=40
    print('本地变量z:',z)
  print('嵌套变量y:',y)
  local_in()
print("全局变量x:",x)
local_out()

代码输出结果如下:

全局变量x: 20

嵌套变量y: 30

本地变量z: 40

Python的内建作用域(Built-in):内建作用域包含Python解释器启动时自动加载的所有名称。这些内建函数和变量在任何作用域中均可调用,其中最常用的莫过于print()。关于所有内建函数的完整列表,可查阅Python官方文档。

LEGB规则:

LEGB是Local(局部)、Enclosed(嵌套)、Global(全局)、Built-in(内建)四个英文单词首字母的缩写。

这四个作用域的范围由小到大依次排列,顺序为:Local ---- Enclosed ---- Global ---- Built-in。其层级关系表现为上层嵌套下层:

2、Python脚本运行时名称查找的顺序:

1)首先在当前所在的层级(局部作用域)中查找名称;

2)如果未找到,则向外层(嵌套作用域)查找;

3)若仍未找到,继续向外层(全局作用域)查找;

4)最后在内建作用域中查找。查找过程不会向内层回溯,也不会跨越同级作用域查找。

def max(s):
  m=min(s)
  return m

numList=[1,2,4,5,7,8,9]
maxNun=max(numList)
print('最大值=',maxNun)

代码输出结果:最大值= 1

在全局范围内调用max()函数时,由于存在一个与内建函数同名的自定义函数max(),Python会优先调用这个自定义函数并停止向外层查找。

在同一作用域内,两个同名名称是相互独立的,互不干扰。

例如,在两个处于同一级别的函数内部,可以分别定义同名的变量,或嵌套同名的函数,它们各自独立。

a=3
def add_1():
  a=30
  print('add_1的 a =',a)

def add_2():
  a = 3000
  print('add_2的 a =', a)

add_1()
add_2()
print('全局变量的 a =', a)

代码输出结果如下:

add_1的 a = 30

add_2的 a = 3000

全局变量的 a = 3

综上所述,本文介绍了Python作用域的基本规则。尽管作用域机制保证了变量的独立性,但仍建议避免在不同层级使用同名函数或变量。由于可使用的命名空间广阔,保持命名清晰有助于减少潜在的错误和混淆。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表