question!I need help!
Topic source上面的 f1, f2, f3 函数体都是饮用的变量 i x i
而下面的 注意看,是又定义了一个高阶函数 f(j) 而 fs.append(f(j)) 此时的 f(j)被立刻执行了,使用了j变量了,返回的是函数g(),所以g()的函数体就是此时 j 的值,而不是饮用了 后面的 f1,f2,f3 的函数体是 1x1 2x2 3x3
把下面的实例代码中函数的位置换一下,运行结果一样,这样看和上面对比一下应该会有所发现 def count(): fs = [] for i in range(1, 4): def f(j): def g(): return j * j return g fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs
我的理解是你先注意下传入参数和引用参数的区别,函数定义里的变量是传入的参数,第一种直接用的引用参数。 每次传入函数的参数值只能是一个值和函数外面的参数怎么变没关系。况且两个参数名字都不一样。。。第一种是没往进去传值,直接引用了,且都是i所以值不固定。外面的函数的参数一变化就GG了 第二种是往大看也是引用的外面f函数的值,但与前一个外面的套套函数对引用参数的循环操作不同的是这个f函数是个空的套套,没对参数做操作,所以人家虽然也是闭包,但是通过一个空的套套,赋给一个新的变量j,挡住了这个参数变化。。。 所以想对一个变化的参数进行引用形成闭包,先给他套个空套套保护起来 大概理解就是这样,不知道对不对,欢迎热烈讨论。
- 1
叫我_小军
前面f1,f2,f3返回[9,9,9]的过程是看懂了。
但是最后 “一定要引用循环变量,再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变” 下面的实例代码没看懂。 不知道大家看懂没有,能够帮我讲解下吗?