python 中的简单 lambda 表达式,但出现错误“比较中超出最大递归深度”

问题描述 投票:0回答:1

这是我的代码。

def div_by_primes_under(n):
    checker = lambda x: False
    i = 2
    while i <= n:
        if not checker(i):
            # checker = (lambda f, i: lambda x: x % i == 0 or f(x))(checker, i) 
            checker = lambda x: (x % i == 0 or checker(x))
        i = i + 1
    return checker

print(div_by_primes_under(10)(12))
print(div_by_primes_under(10)(121))

而且错误信息好像是

Traceback (most recent call last):
  File "hw2.py", line 106, in <module>
    print(div_by_primes_under(10)(12))
  File "hw2.py", line 102, in <lambda>
    checker = lambda x: (x % i == 0 or checker(x))
  File "hw2.py", line 102, in <lambda>
    checker = lambda x: (x % i == 0 or checker(x))
  File "hw2.py", line 102, in <lambda>
    checker = lambda x: (x % i == 0 or checker(x))
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded in comparison

我用嵌套的 lambda 表达式修改了它,它似乎与前者(被注释的行)具有相同的功能。错误消息消失并且按预期运行。

我想知道这是否与Python解释器的原理有关。

python-3.x lambda
1个回答
0
投票

我们可以在没有 lambda 版本的情况下澄清这个问题。

def div_by_primes_under_no_lambda(n):
    def checker(x):
        return False
    i = 2
    while i <= n:
        if not checker(i):
            print(i, "outer")
            def outer(): 
                def inner(x):
                    return f(x) or (x % i == 0)
                return inner
            checker = outer()
        i = i + 1
    return checker

print(div_by_primes_under_no_lambda(10)(12))
print(div_by_primes_under_no_lambda(10)(121))

看来是对的。但我们必须注意到,对于i和checker来说,外部环境并不存在。当我们调用 div_by_primes_under_no_lambda 时,它返回一个 checker 函数,这是一个自递归函数。

© www.soinside.com 2019 - 2024. All rights reserved.