函数的嵌套和作用域链
Posted passengerlee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的嵌套和作用域链相关的知识,希望对你有一定的参考价值。
1:
# 函数的嵌套调用 def max(a,b): return a if a>b else b def Max(x,y,z): c = max(x,y) return max(c,z) print(Max(5,2,0)) def max(a,b): return a if a>b else b def Max(x,y,z): c = max(x,y) return c if c>z else z print(Max(5,2,0))
2:
#函数的嵌套定义 #内部函数可以使用外部函数的变量,但外不可使内 def outer(): # 1 定义outer,把outer放到命名空间 def inner(): # 3 定义inner,若没有调用inner,则无法把inner放到命名空间,也就无法执行 print(‘$$$$‘) # 5 inner() # 4 调用inner outer() # 2 调用outer def outer(): a = 1 def inner(): print(a) print(‘$$‘) inner() outer() def outer(): Mia = ‘beauty‘ def inner1(): print(‘Mia‘) print(‘$$‘) Shaw = ‘cutie‘ def inner2(): print(Shaw) print(‘$$$$‘) inner2() inner1() outer() def outer(): Mia = ‘beauty‘ def inner1(): print(‘Mia‘) print(‘$$‘) Shaw = ‘cutie‘ def inner2(): print(Shaw) print(‘$$$$‘) inner2() inner1() outer()
3:
a = 1 def outer(): a = 1 def inner1(): b = 2 print(a) print(‘$$‘) def inner2(): global a # 声明了一个全局变量,只是使全局空间的a可修改了,而局部空间的a不变 #nonlocal a # 声明了一个上面第一个(从此位置从下往上找)局部变量 a += 1 # 不可变数据类型的修改 print(‘$$$$‘) inner2() inner1() outer() print(‘全局的a:‘,a) # 对应global a #print(‘全局的a:‘,a) # 对应nonlocal a
# 关于 nonlocal def outer(): a = 1 def inner1(): a = 2 def inner2(): nonlocal a a += 1 print(a) inner2() inner1() outer() print(a) # nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量 # 声明了nonlocal的内部函数的变量修改会影响到 离当前函数最近一层的局部变量 # 对全局无效 # 对局部 也只是对 最近的 一层 有影响
4:函数是第一类对象,它符合函数的以下三个用法:函数名可以赋值,可以作为函数的参数,可以作为函数的返回值。
def func(): # 函数名就是内存地址 print(‘love‘) func() func1 = func # 函数名可以赋值 func1() lis = [func,func1] # 函数名可以作为容器类型(可变数据类型:集合,列表和字典)的元素 print(lis) # 打印出它们的内存地址,是一样的 for i in lis: i() def func(): # 函数名就是内存地址 print(‘love‘) def func2(f): f() func2(func) # 函数名可以作为函数的参数 def func(): # 函数名就是内存地址 print(‘love‘) def func2(f): f() return f # 函数名可以作为函数的返回值 lalaland = func2(func) # 有return返回就得有接 print(lalaland)
以上是关于函数的嵌套和作用域链的主要内容,如果未能解决你的问题,请参考以下文章