Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在定义时取消引用闭包变量_Python_Python 3.x_Python Multithreading_Python Decorators - Fatal编程技术网

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.') 调用任何生成

答案很好地解释了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.')
调用任何生成的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)]
它会给你想要的结果。 然而,我无法理解第二个用例