Python作用域详解:LEGB规则与变量查找机制
本文深入解析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作用域的基本规则。尽管作用域机制保证了变量的独立性,但仍建议避免在不同层级使用同名函数或变量。由于可使用的命名空间广阔,保持命名清晰有助于减少潜在的错误和混淆。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













