zoukankan      html  css  js  c++  java
  • 一些令你""呵呵''的题目

    1.下面题目的打印结果是:__________

    lst1 = [lambda x:i+x for i in range(5)]
    lst2=[el(2) for el in lst1]
    print(lst2)

    (1) 将面目全非的题目进行还原得到如下形态:

    lst1=[]
    lst2=[]
    for i in range(5):
        def func(x):
            return i+x                        
        lst1.append(func)
    print(lst1)
    for el in lst1:
        lst2.append(el(2))
    print(lst2)

    基本能看出第一次循环创建了5个函数,然后将函数的内存地址存到列表里,lst1的打印结果是一堆内存地址,此时在第一部分它形成一个闭包这个看的不舒服,将第一部分换个形态

    def func1():
        for i in range(5):
            def func(x):
                return i + x
            lst1.append(func)
        return lst1
    func1()

    这就可以看出是个典型的闭包,来回忆下闭包的内容,重新认识下这个东西:

    闭包的两个特性:

    • 内部函数使用外部函数的变量(不对外部函数的变量进行重新赋值)
    • 外部函数 return 内部函数的函数名(其实是返回内部函数的内存地址)

    对上面的函数进行简化,去掉for循环,使用单个变量代替,直接返回内部函数名

    def func1():
        i=4                        # 定义了变量,也称为内部函数的环境变量,它不会改变,不被外界影响
        def func(x):
            return i + x           # 使用了外部函数的变量
        return func                # 返回了内部函数
    func1()

    简单理解:闭包 = 内部函数 + 环境变量

    闭包的特性:当内部函数返回的时候,会把连同内部函数定义时候的环境变量一同返回

    (2)在进行第二部分调用内部函数

     在lst1中的元素是5个这个函数的函数内存地址,但是调用时候,此时i=4,分别调用一次函数.结果就是[6,6,6,6,6]

  • 相关阅读:
    TCP/IP协议,,OSI的七层参考模型,HTTP请求响应机制
    火狐浏览器缓存导致JS已经改变的ID没改变
    Server.MapPath 出现未将对象引用设置到对象的实例
    线程池发送邮件的方法(向多个用户发送同一邮件)
    用多线程发送邮箱(一次给一个用户发送N封邮件)
    验证文本框输入内容类型是汉字
    名人博客
    tinyget
    内存分析
    Silverlight Forums
  • 原文地址:https://www.cnblogs.com/wcx666/p/9687498.html
Copyright © 2011-2022 走看看