python---变量作用域
文章目录
- 1、局部作用域 (Local - L)
- 2、闭包函数作用域 (Enclosing - E)
- 3、 全局作用域 (Global - G)
- 4、 内建作用域 (Built-in - B)
- 作用域查找规则 (LEGB规则)
- 变量查找细节
- global和nonlocal关键字
- 1、global
- 2、nonlocal
- 注意事项
Python中的变量作用域决定了在程序的哪些部分可以访问某个变量。
Python有4种主要的作用域。
1、局部作用域 (Local - L)
在函数内部定义的变量属于局部作用域,只能在函数内部访问。
def my_func():x = 10 # 局部变量print(x)my_func() # 输出: 10
print(x) # 报错: NameError: name 'x' is not defined
2、闭包函数作用域 (Enclosing - E)
对于嵌套函数,外部函数的变量对内部函数是可见的。
def outer():y = 20 # 闭包作用域变量def inner():print(y) # 可以访问外部函数的变量inner()outer() # 输出: 20
3、 全局作用域 (Global - G)
在函数外部定义的变量或在函数内部用global关键字声明的变量。
z = 30 # 全局变量
def func():
print(z) # 可以访问全局变量
func() # 输出: 30
4、 内建作用域 (Built-in - B)
包含Python内建函数和异常的名称,如print(), len(), Exception等。
作用域查找规则 (LEGB规则)
当访问一个变量时,Python会按照以下顺序查找:
1、局部作用域 (L)
2、最近的闭包作用域 (E)
3、全局作用域 (G)
4、内建作用域 (B)
变量查找细节
# 代码报错,因为定义了局部变量a,但是在局部变量a之前在函数内调用啊
a = 1
def outer():print(a)a = 2print(a)def inner():passinner()outer()
局部变量变化未影响全局变量
a = 1
def outer():a = 2print(a)def inner():passinner()outer()
print(a) # 输出 2 1
global和nonlocal关键字
1、global
在函数内部声明变量为全局变量
global代码示例1:
# 报错,golbal声明之前不允许声明局部变量
a = 1
def outer():a = 2global aprint(a)def inner():passinner()outer()
print(a)
正确写法:
a = 1
def outer():global aa = 2print(a)def inner():passinner()outer()
print(a)
2、nonlocal
在嵌套函数中声明变量来自外层(非全局)作用域
def outer():x = 10 # 外部函数变量def inner():nonlocal x # 声明x来自外部函数x = 20 # 修改外部函数的xinner()print(x) # 输出: 20outer()
多层函数嵌套下的nonlocal关键字
def outer():x = 10def middle():x = 20def inner():nonlocal x # 找到middle的x,而不是outer的xx = 30inner()print("middle x:", x) # 输出: middle x: 30middle()print("outer x:", x) # 输出: outer x: 10outer()
注意事项
1、在函数内部,如果只是读取全局变量而不修改,不需要使用global声明
2、如果要在函数内部修改全局变量,必须使用global声明
3、类中的变量作用域规则与函数不同,类变量可以通过实例或类名访问
4、Python没有块级作用域(如if/for/while语句块不会创建新的作用域)