2024-09-27 09:33:27 发布
网友
下面的代码有什么问题?在
arrs={} def func(i): print i for i in range(1,5): arrs[i]=lambda:func(i) for key in arrs.keys(): arrs[key]()
我要打印1234。而是打印4 4 4 4 4
这是使用lambda时遇到的常见问题。运行arrs[i]=lambda: func(i)时,lambda不会生成保留当前i值的函数。这实际上与普通函数定义完全相同:
arrs[i]=lambda: func(i)
i
def func(i): return i i = 5 def anon(): return func(i) i = 0 anon()
i被视为任何标准变量,其值最初是在函数的本地命名空间中搜索的,因为它不在那里,所以它将在全局级别上搜索该名称。此时它会找到当前值i,而不是函数最初定义时的i的值。在
解决这个问题的一种方法(也是一种常见的习惯用法)是用一个输入创建lambda函数,并将当前值i指定为默认参数。在
这将在函数定义时将i的值绑定为默认参数,因此不受全局i值的影响。在
这是使用lambda时遇到的常见问题。运行
arrs[i]=lambda: func(i)
时,lambda不会生成保留当前i
值的函数。这实际上与普通函数定义完全相同:i
被视为任何标准变量,其值最初是在函数的本地命名空间中搜索的,因为它不在那里,所以它将在全局级别上搜索该名称。此时它会找到当前值i
,而不是函数最初定义时的i
的值。在解决这个问题的一种方法(也是一种常见的习惯用法)是用一个输入创建lambda函数,并将当前值
^{pr2}$i
指定为默认参数。在这将在函数定义时将
i
的值绑定为默认参数,因此不受全局i
值的影响。在相关问题 更多 >
编程相关推荐