第6章 函数
- 6.1 函数的定义和调用
- 6.2 参数传递
- 6.3 函数返回值
- 6.4 变量作用域
- 6.5 匿名函数(lambda)
- 6.6 递归函数
- 6.7 迭代器
- 6.8 生成器
- 6.9 装饰器
6.4 变量作用域
作用域指的是变量的有效范围,根据变量的有效范围将变量分为局部变量和全局变量。
6.4.1、局部变量
局部变量是指在函数内部定义并使用的变量,它只在函数内部有效,一旦执行完毕,局部变量就会被回收,无法访问。
6.4.2、全局变量
全局变量为能够作用于函数内外的变量。
1、如果一个变量,在函数外定义,那么不仅函数外可以访问到,在函数内也可以访问到。
当局部变量与全局变量重名时,对函数体的变量进行赋值后,不影响函数体外的变量。
2、在函数体内定义,并且使用global关键字修饰,该变量就是全局变量。在函数体外也可以访问到该变量,并且在函数体内外还可以对其进行修改。
尽管python允许全局变量和局部变量重名,但是在实际开发时,不建议这么做,因为这样容易让代码混乱,很难分清哪些是全局变量,哪些是局部变量。
# 块级别,变量是没有作用范围的,相当于全局变量
## if语句
if True:
color = "绿色"
print(color)
output:
绿色
## for语句
list1 = []
for i in range(3):
list1.append(i)
print(i)
output:
2
# 函数级别,变量是有作用范围的
def function_print(): # 传递不定长参数,即参数个数不固定
week = "星期三"
print(week)
output:
NameError: name 'week' is not defined
# 类级别,变量是有作用范围的
class Date1():
day = 1
week = "星期三"
print(day)
output:
NameError: name 'day' is not defined
从程序运行结果来看,函数级别、类级别中的变量有作用域,语句块级别的变量没有作用域。
Python的作用域一共有4层,分别是:
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域
Python以L –> E –> G –>B
的规则查找变量,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,最后去内建中找。如果这样还找不到,那就提示变量不存在的错误。
MIN = 1 # 全局变量
MAX = 8 # 全局变量
print(f"MIN={MIN},MAX={MAX}")
def func1():
global MIN # 使用global关键字 修改全局变量
MIN += 1
a = 5 # 局部变量
b = 1
print(f"MIN={MIN},a={a},b={b}")
def func2():
MAX = 9 # 局部变量与全局变量同名,局部变量会覆盖全局变量
nonlocal a # 使用nonlocal关键字 修改外部函数的变量
a += 1
b = 2 # 内部函数变量与外部函数变量同名,覆盖
print(f"MIN={MIN},MAX={MAX},a={a},b={b}")
func2() # 内部函数被外部函数调用
func1()
print(f"MIN={MIN},MAX={MAX}")