顾名思义,内嵌函数(或者嵌套函数)是指在一个函数里嵌套另一个函数。
def mytest1():
print("mytest1正在被调用……")
def mytest2():
print("mytest2在被调用……")
mytest2()
mytest1()
"""输出结果:
mytest1正在被调用……
mytest2在被调用……
"""
注意:内部函数的调用只能在外部函数这个作用域中,出了外部函数,则无法调用内部函数。因为python会在全局中寻找 mytest2函数 ,但是此时全局并没有创建,所以会报错。如下图所示:
如果在一个内部函数里对外部作用域(但不是在全局作用域)的变量进行引用,内部函数就被认为是闭包。
举个例子:
def testA(a):
def testB(b):
return a + b
return testB
i = testA(10)
print(i)
如上图,testA函数相当于外部函数,testB函数相当于内部函数,在testB里引用了testA的变量a ,那么testB就被认为是闭包。
执行上面的代码,如下图所示。python所有的东西都可以视为一个对象,所以可以直接返回函数本身。
如果还不是很确定,那我们可以看一下返回结果的类型。
如果要返回testB函数的结果,需要再对testB进行传参,如下图所示:
上面分了2步才执行出testB的返回结果,其实也可以有简便写法,一次性输出testB的结果,如下图所示:
这里需要注意的是,不能在外部函数的外边对内部函数进行调用。和上面内嵌函数说的是一个道理,内部函数的调用只能在外部函数这个作用域中。
2.3 访问和修改外部函数的变量外部函数的局部变量对于内部函数来说相当于内部函数的"全局变量"(并非全局中的全局变量)。可以直接访问,但不能直接修改,否则会报错。
def test1():
x = 5
def test2():
return x # 可以直接访问到外部函数的变量x
return test2()
print(test1())
#输出结果: 5
若是必须要修改外部函数中的局部变量,则需要在内部函数开头加上:nonlocal 变量名。
总结:
- 如果在一个内部函数里对外部作用域(但不是在全局作用域)的变量进行引用,内部函数就被认为是闭包;
- python所有的东西都是对象,所以可以直接返回函数本身;
- 不能在外部函数的外边对内部函数进行调用;
- 外部函数的局部变量对于内部函数来说相当于内部函数的全局变量,可以直接访问,但不能直接修改。如果一定要修改,需要在内部函数开头加上:nonlocal 变量名
以上就是对于内嵌函数和闭包的理解,如有补充和建议请评论区留言,共同进步,感谢!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)