分析一个闭包函数

分析一段代码

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

先说最下面的f1,f2,f3=counrt()

f1, f2, f3 = count()
相当于
[f1, f2, f3] = [f,  f, f]

相当于
f1 = f

f2 = f

f3 = f

fs.append(f)

注意这里是将函数f添加到了fs中,而不是f返回的值,可以尝试执行命令:

>>> f
<function f at 0x00000283BF7706A8>
>>> count()
[<function count.<locals>.f at 0x00000283BF770840>, <function count.<locals>.f at 0x00000283BF7707B8>, <function count.<locals>.f at 0x00000283BF770598>]

可见返回的是一个由三个函数组成的list。
因此当执行代码

f1, f2, f3 = count()

时,将count包含的三个函数按索引顺序分别赋给f1, f2, f3,而此时i=3,所以函数计算结果全部为9.

>>> f1()
9
>>> f2()
9
>>> f3()
9

在python中一切皆对象,而变量i只有一个,在三次循环中,它指向的对象变化了而已,而函数f1,f2,f3在实际执行的时候i指向的那个地址的实际存放数据已经变为3了,所以三次结果都是一样的。

fs.append(f)这里的f只是指针  不是函数  所以不执行  等到什么时候用什么时候执行 所以在for循环3次之后i变成了3  f总是在所有的执行完了才会去调用  因为它被放在【】中

不管调用几次count  他其中的for已经执行3次  i已经变成3所以此时执行f函数   使用的当然是3

时间: 2024-08-01 02:35:04

分析一个闭包函数的相关文章

Javascript闭包函数快速上手

闭包函数是什么?在开始学习的闭包的时候,大家很能都比较难理解.就从他的官方解释来说,都是比较概念化的. 不过我们也还是从闭包的含义出发. 闭包是指函数有自由独立的变量.换句话说,定义在闭包中的函数可以"记忆"它创建时候的环境. 官方解释说完后,我们先来看一个简单计数的例子. var c = 0; function count(){ c++; } count();// 1 count();// 2 这个例子是利用了全局变量来实现,但是这里有个问题是,c这个变量也容易被其他方式所调用,这时

python命名空间与闭包函数详解

python命名空间与闭包函数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的知识点如下: 1>.三元运算 2>.命名空间 3>.global与nonlocal 4>.函数即变量 5>.嵌套函数 6>.闭包函数 一.三元运算 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yi

Python作用域--&gt;闭包函数--&gt;装饰器

1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往外

python_005_匿名函数,闭包函数,递归函数

一.匿名函数 #匿名函数:帮助开发人员完成简单的业务处理逻辑"""语法lambda 参数1, 参数2, 参数3...: 函数体注意函数体内部代码只能存在一句表达式,如果该表达式计算之后有结果,此时该结果作为匿名函数的返回值返回给外界""" #fun1 = lambda x, y, **kwargs: max(x, y)#num = fun1(1,2)#print(num) 二.闭包函数 #闭包函数"""两个函数A,B

实验作业:使gdb跟踪分析一个系统调用内核函数

实验作业:使gdb跟踪分析一个系统调用内核函数(我使用的是getuid) 20135313吴子怡.北京电子科技学院 [第一部分] 根据视频演示的步骤,先做第一部分,步骤如下 ①更新menu代码到最新版 ②在代码中加入C函数.汇编函数 ③在main函数中加入makeconfig ④make rootfs ⑤可以看到qemu中增加了我们先前添加的命令: ⑥分别执行新增的命令 [第二部分]gdb跟踪分析一个系统调用内核函数 ①进入gdb调试 ②设置断点,继续执行: ③相对应的得到这样的结果: ④查看我

python编程中的闭包函数

什么是闭包? 简单说,闭包就是根据不同的配置信息得到不同的结果 再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体. 看概念总是让人摸不着头脑,看几个python小例子就会了 例1 def make_adder(addend):     def adder(augend):      

javascript闭包函数

JavaScript中的匿名函数及函数的闭包 1.匿名函数 2.闭包 3.举例 4.注意 1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种:这也是最常规的一种 function double(x){ return 2 * x; } 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用. var dou

从一道面试题分析javascript闭包

据说是一不注意就会做错的五道javascript面试题之一,我们来看看这道题长什么样 function Container( properties ) { var objthis = this; for ( var i in properties ) { (function(){ var t = properties[i]; objthis[ "get" + i ] = function() {return t;}; objthis[ "set" + i ] = f

8 闭包函数和装饰器

闭包函数定义 #内部函数包含对外部作用域而非全局作用域的引用 #提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇 def counter(): n=0 def incr(): nonlocal n x=n n+=1 return x return incr c=counter() print(c()) print(c()) print(c()) print(c.__closure__[0].cell_contents) #查看闭包的元素 应用场景