Python在定义时取消引用闭包变量
答案很好地解释了python内部函数如何在内部函数实际执行之前不使用闭包变量的值,从而在适当的范围内找到变量名 例如:Python在定义时取消引用闭包变量,python,python-3.x,python-multithreading,python-decorators,Python,Python 3.x,Python Multithreading,Python Decorators,答案很好地解释了python内部函数如何在内部函数实际执行之前不使用闭包变量的值,从而在适当的范围内找到变量名 例如: funcs = [(lambda: x) for x in range(3)] for idx in range(3): @thread_this(name=f'thread_{idx}') def custom(): do_something() print(f'thread_{idx} complete.') 调用任何生成
funcs = [(lambda: x) for x in range(3)]
for idx in range(3):
@thread_this(name=f'thread_{idx}')
def custom():
do_something()
print(f'thread_{idx} complete.')
调用任何生成的lambda返回2:
函数[0]()
2.
>>>funcs[1]()
2.
>>>funcs[2]()
2.
是否有办法在定义函数时而不是在以后执行函数时强制确定x的值?在上述示例中,我希望的输出分别为0、1、2
更具体地说,我的用例是为API用户提供一种方法,使用装饰器方便地将自定义函数转换为线程。例如:
funcs = [(lambda: x) for x in range(3)]
for idx in range(3):
@thread_this(name=f'thread_{idx}')
def custom():
do_something()
print(f'thread_{idx} complete.')
当执行最终的print语句时,它将拾取全局范围内的
idx
的当前值。使用适当的sleep语句,所有3个线程都将打印“thread\u 2 complete”。您可以使用functools。部分,第一个问题可以通过
funcs = [functools.partial(lambda x: x, x) for x in xrange(3)]
它会给你想要的结果。
但是,我无法理解第二个用例。您可以使用functools。第一个问题可以通过
funcs = [functools.partial(lambda x: x, x) for x in xrange(3)]
它会给你想要的结果。
然而,我无法理解第二个用例