Discuss / Python / 用lambda直接替换_not_divisible函数,会出不一样结果,原理上说不通啊

用lambda直接替换_not_divisible函数,会出不一样结果,原理上说不通啊

Topic source

静水流深

#1 Created at ... [Delete] [Delete and Lock User]

生成素数的代码最后一行,如果用lambda直接替换:

it = filter(lambda x: x % n > 0, it)

结果就会出现很多非素数,按道理不应该啊,求大神解惑!

静水流深

#2 Created at ... [Delete] [Delete and Lock User]

自问自答,算是明白一半吧,lambda函数不记录编写时的上下文环境,只按照运行时上下文环境临时生成函数,所以直接用lambda函数替换的话,n的值会全部用当时的n值代替:

n = 3

f = lambda x: (print(f'n = {n}')) or (x % n > 0)

n = 4

print(f(9))

==>n = 4 False

甚至lambda函数的函数体时允许出现lambda之前未定义的变量,只要在调用前赋值就行。

所以前面的n = 3删除掉也能正常运行不报错。

感觉python和lisp确实还是在lambda上有区别


  • 1

Reply