相关疑难解决方法(0)

在循环中创建函数

我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:

functions = []

for i in range(3):
    def f():
        return i

    # alternatively: f = lambda: i

    functions.append(f)
Run Code Online (Sandbox Code Playgroud)

这输出:

print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output:   [2, 2, 2]
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

python function

79
推荐指数
2
解决办法
3万
查看次数

如何创建Python lambdas列表(在列表解析/ for循环中)?

我想从Python中的常量列表中创建一个lambda对象列表; 例如:

listOfNumbers = [1,2,3,4,5]
square = lambda x: x * x
listOfLambdas = [lambda: square(i) for i in listOfNumbers]
Run Code Online (Sandbox Code Playgroud)

这将创建一个lambda对象列表,但是,当我运行它们时:

for f in listOfLambdas:
    print f(),
Run Code Online (Sandbox Code Playgroud)

我希望它会打印出来

1 4 9 16 25
Run Code Online (Sandbox Code Playgroud)

相反,它打印:

25 25 25 25 25
Run Code Online (Sandbox Code Playgroud)

似乎lambdas都被赋予了错误的参数.我做错了什么,有没有办法解决它?我认为我在Python 2.4中.

编辑:更多的尝试事情,并提出了这样的想法:

listOfLambdas = []
for num in listOfNumbers:
    action = lambda: square(num)
    listOfLambdas.append(action)
    print action()
Run Code Online (Sandbox Code Playgroud)

将预期的正方形从1打印到25,然后使用之前的print语句:

for f in listOfLambdas:
    print f(),
Run Code Online (Sandbox Code Playgroud)

仍然给了我所有25的.现有的lambda对象在这两个打印调用之间是如何变化的?

相关问题:为什么map()和列表理解的结果不同?

python lambda closures scope list-comprehension

35
推荐指数
4
解决办法
1万
查看次数

在Python中定义函数列表

可能重复:
Python lambdas和范围

我希望以下将产生3个常量函数的列表,取值为0,1和2:

lis = []
for i in range(3):
    lis.append( lambda: i )
Run Code Online (Sandbox Code Playgroud)

但他们最终都获得了价值2.我希望深度复制可以解决这个问题,但似乎没有用.

python lambda loops

5
推荐指数
1
解决办法
1740
查看次数

标签 统计

python ×3

lambda ×2

closures ×1

function ×1

list-comprehension ×1

loops ×1

scope ×1