生成器和实际变量值

时间:2011-08-10 19:02:00

标签: python generator

我需要编写一个返回sum函数列表的函数,在某个绑定值中添加一个输入数字。这就是我所做的:

def addition_range(start, end):
    if start >= end: return None

    #res = ( (lambda x: x + i) for i in range(start, end) ) #1
    res = [ (lambda x: x + i) for i in range(start, end) ] #2

    return res

for i in addition_range(0, 5): print( i(2) )

输出应该是:2,3,4,5,6,但它是6,6,6,6,6

问题在于“i”变量,当我调用函数时,它们使用i(4)的实际值,而不是在生成列表期间使用的值。问题可以通过使用(#1)代替(#2)来解决,但我感兴趣的是(#2)有解决方案吗?我试过了

res = [ (lambda x: x + copy.deepcopy(i)) for i in range(start, end) ]

但它没有帮助。

谢谢。

WinXP + Python 3.2

1 个答案:

答案 0 :(得分:1)

解决此问题的最简单方法是添加一个虚拟参数:

def addition_range(start, end):
    res = [(lambda x, i=i: x + i) for i in range(start, end)]
    return res or None

在定义lambda时计算dummy参数,而只有在调用lambda时,你的版本才会计算i

附注:我添加了or None部分仅用于模拟实施的确切行为。返回空列表而不是None

可能会更好
def addition_range(start, end):
    return [(lambda x, i=i: x + i) for i in range(start, end)]