zoukankan      html  css  js  c++  java
  • python的闭包与延时绑定问题

    起源于一道面试题...

    def mul():
        return [lambda x : i*x for i in range(4)]
    
    print([m(2) for m in mul()])
    
    # output:
    # [6, 6, 6, 6]

    为什么答案是[6,6,6,6]而不是[0,2,4,6]呢?

    为了便于理解,把代码改写成下面的样子

    def mul():
        func_list = []
        for i in range(4):
            def lam(x):
                return x*i
            func_list.append(lam)
        return func_list
    
    print([m(2) for m in mul()])

    怎么理解呢?简单来说,在python里,相对而言的局部变量绑定的是值,非局部变量绑定的是空间, 而不是值本身,所以,for循环生成的i,相对于函数lam来说,是全局变量,所以绑定的是i所在的内存地址,但i最后变成了3,lam绑定的是3。

    所以导致了,生成的四个函数所得值时相同的.

    那么如何实现结果为 [0, 2, 4, 6] 呢? 按照刚才的思路,我们只需将lam函数中的 i 变成局部变量,这样函数lam绑定的就是值, 而不是内存地址:

    def mul():
        func_list = []
        for i in range(4):
            def lam(x,i=i):
                return x*i
            func_list.append(lam)
        return func_list
    
    print([m(2) for m in mul()])

    这里i是局部变量,所以绑定的是i的值

  • 相关阅读:
    openfire 介绍安装使用
    android rabbitMQ
    转:socket编程在windows和linux下的区别
    socklen_t在windows和linux平台下的头文件定义
    libevent入门教程
    libevent安装
    《RabbitMQ in action》
    RabbitMQ安装和配置
    node.js模块之http模块
    node.js模块之Buffer模块
  • 原文地址:https://www.cnblogs.com/louyifei0824/p/9879373.html
Copyright © 2011-2022 走看看