当我运行以下脚本时,两个lambda都在同一文件junk.txt上运行os.startfile()。我希望每个Lambda都使用创建Lambda时设置的值“f”。有没有一种方法可以使它按我的预期运行?

import os


def main():
    files = [r'C:\_local\test.txt', r'C:\_local\junk.txt']
    funcs = []
    for f in files:
        funcs.append(lambda: os.startfile(f))
    print funcs
    funcs[0]()
    funcs[1]()


if __name__ == '__main__':
    main()

最佳答案

一种方法是执行此操作:

def main():
    files = [r'C:\_local\test.txt', r'C:\_local\junk.txt']
    funcs = []
    for f in files:
        # create a new lambda and store the current `f` as default to `path`
        funcs.append(lambda path=f: os.stat(path))
    print funcs

    # calling the lambda without a parameter uses the default value
    funcs[0]()
    funcs[1]()

否则,在调用该函数时会查找f,因此您将获得当前(循环后)的值。

我更喜欢的方式:
def make_statfunc(f):
    return lambda: os.stat(f)

for f in files:
    # pass the current f to another function
    funcs.append(make_statfunc(f))

甚至(在python 2.5+中):
from functools import partial
for f in files:
    # create a partially applied function
    funcs.append(partial(os.stat, f))

09-28 00:21