局部变量:在函数内部定义的变量(局部命名空间)
全局变量:在函数外部定义域或者使用global在函数内部定义(全局命名空间)
作用域:作用的范围
局部变量作用域:在函数的内部
全局变量的作用域:横跨整个文件
生命周期:
内置变量 > 全局变量> 局部变量
# 1.局部变量deffunc():# 定义局部变量
a=5# 获取局部变量print(a)# 修改局部变量
a =10print(10)
func()print(a)# error 不能全局调用局部变量# 2. 全局变量# 定义全局变量
b =10# 获取全局变量print(b)# 修改全局变量
a =20# 可以在函数内部获取全局变量
b =20deffunc():print(a)
func()# 20 # 3.使用global 在函数内部创建全局变量deffunc():global c
c =8
func()print(c)# 8# 4.使用global在函数内部修改全局变量
d =300deffunc():global d
d =123
func()print(d)# 123# 总结:
可以使用global关键字在函数内部定义一个全局变量
也可以使用global在函数内部修改一个全局变量
函数名的使用
python中的函数可以像变量一样,动态创建,销毁,当参数传递,作为值返回,叫第一类对象.其他语言功能有限
deffunc():print("我是func函数")return1111. 函数名十个特殊的变量,可以当做变量赋值
a = func # 把func赋值给aprint(a)# <function func at 0x000002332ACE4048>
a()# 我是func函数2. 函数名可以作为容器类型数据的元素
deffunc1():print("我是func1函数")deffunc2():print("我是func2函数")deffunc3():print("我是func3函数")
lst =[func1,func2,func3]for i in lst:
i() 相当于 func1()
结果为:我是func1函数 我是func2函数 我是func3函数
# 3.函数名可以作为函数的参数deffunc4(f):
f()# 相当于 func3()
func4(func3)# 把函数func3 作为参数传给了func4# 4.函数名可以作为函数的返回值 deffunc(f):return f # f->func4
res= func(func4)
res()# 相当于 func4# ###__doc__ 或者help查看文档
函数的嵌套
'''
函数之间可以嵌套'
外层的叫做外函数
内层的叫做内函数
'''defouter():definner():print("我是inner函数")
inner()
outer()'''
(1) 内部含数不可以直接在函数外部调用
(2) 调用外部函数后,内部函数也不可以在函数外部调用
(3) 内部函数可以在函数内部调用
(4) 内部函数在函数内部调用时,必须先定义在调用
# 外层是outer,内层是inner ,最里层是small,调用small里面的所有代码
'''defouter():definner()":defsmaller():print("我是smaller函数")
small()
inner()
outer()# LEGB原则(就近找变量原则)"""
#找寻变量的调用顺序采用LEGB原则(即就近原则)
B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)
G —— Global(module); 函数外部所在的命名空间 (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
L —— Local(function);当前函数内的作用域 (局部作用域)
依据就近原则,从下往上 从里向外 依次寻找
"""
修改局部变量 nonlocal
"""
nonloca 遵循LEGB就近找变量原则
(1)找当前空间上一层的局部变量进行修改
(2)如果找不发到,会继续向上寻找
(3)最后什么也没有,直接报错
"""# (1) 找当前空间的上一层局部变量进行修改defouter():
a =100definner():nonlocal a
a =34
inner()print(a)
outer()# 34# (2) 如果找不到,会继续相上寻找defouter():
a =100definner():defsmaller():nonlocal a
a =400print(a)# 400
smaller()print(a)# 400
inner()print(a)# 400
outer()# (3) 注意点:nonlocal只能修改局部变量
a =100defouter():definner():defsmaller():nonlocal a
a =400print(a)
smaller()print(a)
inner()print(a)
outer()# 4 不能使用nonlocal 修改全局变量