目录
- 局部变量&全局
- 例子
- 总结
- 内部函数
- 总结
- 变量作用域
局部变量&全局
#局部变量--某个班级的风扇和空调
#全局变量--公共的,饮水机,每个班级都可以去打水
name='yueyue'#全局变量
def func():
s='abc'#局部变量,仅限于在函数内部使用
print(s)#abc
# print(s)# 报错
def func1():
print(name)#yueyue
print(name)#yueyue
def func2():
name='小月月'#局部变量与全局变量同名
name+='弹吉他的小美女'
print(name)#小月月弹吉他的小美女
def func3():
print(name)
# name+='会弹吉他' 报错,全局的改变不了,上面那个改的了是因为他改的其实是局部变量的name
#函数内部的变量可以随便修改赋值,但是全局的变量就不能随便在函数体中修改
#解决方案 ---在全局变量前声明global 且声明在函数体的第一句
def func4():
global name #如果要修改全局的name则需要加上global
print(name)#yueyue
name+='会弹吉他'
print(name)#yueyue会弹吉他
func()
func1()
func2()
func4()
例子
#局部与全局
name='月月'
list1=[1,2,4,6]
def func():
name='蕾蕾'
print('func:',name)
print('func:',list1)
def func1():
global name
print('func1:',name)
name+='真漂亮'
print('func1:',name)
list1.append(8)#由于list是可变类型的,我可以在函数体内直接修改,无须声明global
print('func1:',list1)
func1()
func()
'''
func1: 月月
func1: 月月真漂亮
func1: [1, 2, 4, 6, 8]
func: 蕾蕾
func: [1, 2, 4, 6, 8]
总结:如果全局变量是不可变的,在函数内进行修改则需要添加global关键字,如果是可变的,则在函数内修改时不需要声明
'''
#在函数内既用局部的又用全局的---不能这么用,可以把局部变量用另外一个名字
# def func2():
# name='lucy'
# name+='hhh'
# print(name)
# global name
# print(name)
总结
内部函数
#内部函数
'''
特点:
1.可以访问外部函数的变量
2.内部函数可以修改外部函数的《可变类型》的变量,比如list1
'''
def func():
#声明变量
n=100 #局部变量
list1=[3,6,9,4] #局部变量
#声明内部函数
def inner_func():
nonlocal n
#对list1里面的元素进行加n操作
for index,i in enumerate(list1):
list1[index]=i+n #可以直接修改外部函数的可变类型变量
list1.sort()
# 外部函数的不可类型变量如果要修改必须要声明
n+=101
inner_func() #调用内部函数
print(list1)
print(n)
#调用外部函数
func()
a=100
list2=[1,2]
def func2():
b=99
def inner_func():
nonlocal b
global a
c=88
#尝试修改
c+=12
b+=1
a+=10
list2.append(3)
print(a,b,c,list2)
inner_func()
print(locals())#看func有哪些孩子{'inner_func': <function func2.<locals>.inner_func at 0x00000249C60FA048>, 'b': 100}
func2()
'''
[103, 104, 106, 109]
201
110 100 100 [1, 2, 3]
'''
总结
总结:内部函数可以访问外部函数的局部变量
内部函数可以直接修改外部函数的可变类型变量
内部函数不可以直接修改外部函数的不可变类型变量,变量需要在内部函数里面用nonlocal声明
内部函数可以访问函数外的全局变量
内部函数可以直接修改全局变量的可变类型变量
内部函数不可以直接修改全局变量的不可变类型变量,变量需要在内部函数里面用local声明
a=100
def func2():
b=99
def inner_func():
c=88
print(a,b,c)
inner_func()
func2()
变量作用域
#变量作用域
'''
LEGB
L:local 本地 本层局部变量
E:enclosing 外层局部变量
G:Global 全局
B:built-in python内置的
搜索规则:从里往外
'''
'''
嵌套函数 :可以直接调用内层函数也可以把内层函数返回出来
闭包:1.内层引用外层的变量
2.返回内存函数
装饰器:用于修饰函数,把函数作为参数
1.内存函数
2.内存函数引用外层函数的变量
3.返出内存函数
4.函数作为外层函数参数
使用装饰器:
@装饰器名字
def 函数名():
pass
双层装饰器(两个@xxx)
装饰器带参数(嵌套三层函数)
'''