当前位置: 首页 > 面试题库 >

这个python函数中的lambda表达式是怎么回事?

颜嘉誉
2023-03-14
问题内容

为什么这种尝试创建咖喱函数列表的方法不起作用?

def p(x, num):
    print x, num

def test():
    a = []
    for i in range(10):
        a.append(lambda x: p (i, x))
    return a

>>> myList = test()
>>> test[0]('test')
9 test
>>> test[5]('test')
9 test
>>> test[9]('test')
9 test

这里发生了什么?

实际上执行我期望上述功能执行的功能是:

import functools
def test2():
    a = []
    for i in range (10):
        a.append(functools.partial(p, i))
    return a


>>> a[0]('test')
0 test
>>> a[5]('test')
5 test
>>> a[9]('test')
9 test

问题答案:

在Python中,在循环和分支中创建的变量没有作用域。您创建的所有函数lambda都引用了相同的i变量,该变量9在循环的最后一次迭代中设置为。

解决方案是创建一个返回函数的函数,从而确定迭代器变量的范围。这就是该functools.partial()方法行之有效的原因。例如:

def test():
    def makefunc(i):
        return lambda x: p(i, x)
    a = []
    for i in range(10):
        a.append(makefunc(i))
    return a


 类似资料:
  • 对于定义一个简单的函数, Python 还提供了另外一种方法,即使用本节介绍的 lambda 表达式。 lambda 表达式,又称 匿名函数,常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。 lambda 表达式的语法格式如下: name = lambda [list] : 表达式 其中,定义 lambda 表达式,必

  • 正则获取指定字符到下一个大写字符之间的内容

  • 这是怎么回事?我不明白count()是如何既等于withCallback又有一个主体的;不知何故,它是在withCallback返回的dataframe上调用的,但我不明白语法。

  • 问题内容: 我来自OOP背景,尝试学习python。我使用的函数使用lambda表达式返回列表中具有最大类型的实例。 该函数正确地返回具有maximum类型的实例。我对以下三件事感到困惑: 该功能如何工作?它正在采取什么论点?我查看了文档,但听不懂。 max函数中关键字的用途是什么?我知道它也用于功能上下文 lambda表达式的含义?如何阅读它们?它们如何工作? 这些都是非常笨拙的概念性问题,但可

  • 在很多资料中,经常会看到这样一句话:“Python 中的函数是第一类对象”。关于这一点,Python 的创始人 Guido 曾提过 “First-class Everything”,他对 Python 的一个发展目标就是所有的对象都是第一类对象。 1. 将函数作为第一类对象 1.1 什么是第一类对象 在前言中所说的第一类对象,其实是指函数作为一个对象,与其它对象具有相同的地位。具体来说,数值可以被