首先,函数在python中可以像变量一样生成,传递,赋值。函数可以嵌套定义,像变量一样有作用域。函数对象有一些属性,比如:__doc__可以查看函蚂菊数注释,__annotations__可以查看类型标注,__code__可以获取code对象(可用dis查看反汇编),__closure__可以查看闭包。
是一个嵌套的函数定义,且内层函数读取了外层函数中的x。可以看到__closure__闭包中存在一个Cell Variable,它就是对x的引用。
如刚才所见,python的闭包构造是将要引用的变量放在__closure__中。因此的代码,所有构造的函数指向了同一个变量y(如红框,它们地址相同),且y的值是最终值4,所以用lambda表达式构造的这几个函数都是计算x -> x**4,而不是分别计算x**0, x**1, .... 这是一个容易犯的错误。八率
有一种work around是使用eval函数,将当前y值转化为字符串,再将整个字符串eval。但这不是一种安全的做法。
另段披往一种方式是将要作为常量的值写成默认参数。默认参数的计算会在函数构造时进行,因此每个函数有了不同的default_y。
同理,嵌套函数的声明当中,如果闭包中的变量是常数,也可以用默认参数代替。