Python递归作用域问题

2024-04-26 23:05:55 发布

您现在位置:Python中文网/ 问答频道 /正文

昨天,我做了一个Eratosthenes筛来生成素数,遇到了一个我真的搞不懂的小怪事。你知道吗

我的原始代码如下所示:

def generate(n, p=2, primes=[2], composites=set()):
    numbers = [i for i in range(p + 1, n + 1) if i % 2 != 0]
    composites = composites.union({p * i for i in range(p ** 2, n)})
    for i in numbers:
        if i > p and i not in composites:
            primes.append(i)
            return generate(n, i, primes, composites)
    else:
        return primes

但是,连续的呼叫会发生这种情况:

>>> generate(5)
[2, 3, 5]
>>> generate(5)
[2, 3, 5, 3, 5]
>>> generate(5)
[2, 3, 5, 3, 5, 3, 5]
>>> generate(5)
[2, 3, 5, 3, 5, 3, 5, 3, 5]

所以每次通话都会加上[3,5]。在连续调用generate函数之后,“primes”列表似乎在作用域中。你知道吗

我通过在函数递归时传递列表的副本来修复它。你知道吗

    if i > p and i not in composites:
        return generate(n, i, primes + [i], composites)

有人知道这里发生了什么吗?你知道吗


Tags: and函数in列表forreturnifnot
1条回答
网友
1楼 · 发布于 2024-04-26 23:05:55

因为您通过函数参数传递它,所以每个函数的独立作用域都指向相同的数据。变异其中一个会使它到处变异。你知道吗

相关问题 更多 >