python函数闭包解析 python 闭包函数( 三 )


return fs
# count()返回三个函数的列表 , unpack 列表的语法把列表中的三个函数抽出来,重新给他们命名为 f1, f2, f3
# 也就是说,
# locals['f1'] = 列表中的第1个函数
# locals['f2'] = 列表中的第2个函数
# locals['f3'] = 列表中的第3个函数
# 这三个函数跟'f'这个名字现在毛关系都没有 。(其实是有的,但为了说明需要简化,现在你可以完全不管括号里面说的话)
f1, f2, f3 = count()
print f1(), f2(), f3()
# 好了我们运行它们 , 输入都是 9
# def f():
#return i * i
这是因为 f1 现在对应的函数,里面引用了 'i' 这个字符串,我们根据 'i '这个字符串去找它对应的值,先找到 f 当前的locals字典 , 发现没有,因为函数定义的时候没有定义 i 变量 。然后再去closure['i']里面找 , 因为Python是通过closure字典实现闭包的(就当它是对的好不好),所以我们可以在closure['i']找到值 , 这个值就是我们上一次运行的时候count函数里面残留的locals['i'],而由于for循环三遍之后,locals['i'] == 3,所以找到 i 的值就是3 。所以最后输出都是9
请教大神一个关于python闭包的问题在python3.0之前的版本中, 闭包只能够访问而不能修改外部变量(非全局), 所以, 通常为了方便修改, 我们就使用可变对象来通过修改对象内部的一些引用来达到间接修改的目的, 因此, 通常的数字类型, 字符串类型等不可变类型不可以作为用于修改的自由变量(闭包中引用的外部变量)
在python3.0及以后版本中, 通过nonlocal关键字解决了这个问题, 并增强了闭包. 在之前的版本中, 外部变量实际上是会放入内部函数(闭包)的local这个名称空间中的, 所以, 在之前版本中, 我们在闭包内试图修改一个外部变量的时候, 往往会得到一个"在引用之前没有赋值"的一个错误. 3.0之后, 给要在闭包内修改的变量加上(在闭包内修改之前)nonlocal的声明, 然后, 在下面的代码中修改就可以了....
这个用法和global关键字解决函数内修改全局变量有异曲同工之妙...
【python函数闭包解析 python 闭包函数】关于python函数闭包解析和python 闭包函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

推荐阅读