在python中定义函数时锁定外部变量

时间:2017-04-18 00:11:49

标签: python

我的一个函数将使用外部变量,但是当我使用此函数时外部变量将会改变。这是一个例子:

func_list=[]
for i in range(0,6):
    def func():
        print(i)
    func_list.append(func)
for j in range(0,6):
    func_list[j]()

我希望输出为[1,2,3,4,5,6],但实际输出是[6,6,6,6,6,6] 我知道其中一个解决方案是使用闭包,如下所示:

func_list=[]
for i in range(0,6):
    def create_func():
        nonlocal i
        number=i
        def func():
            print(number)
        return func
    func=create_func()
    func_list.append(func)
for j in range(0,6):
    func_list[j]()

这个程序可以输出[1,2,3,4,5,6]。但它看起来有点难看。它使用额外的4行,至少3行来解决这个问题......是否有一些更简单的方法/函数装饰来解决这个问题?

谢谢。

1 个答案:

答案 0 :(得分:0)

试试这个:

func_list=[]
for i in range(0,6):
    def func(i = i):
        print(i)
    func_list.append(func)

for j in range(0,6):
    func_list[j]()

它的工作原理是因为i在函数定义中进行了评估,其作为关键字参数的默认值而不是变量。 / p>

当然,如果你需要传递一个名为i的关键字参数,这将会中断,在这种情况下你可能想要使用你提供的(丑陋的)解决方案。