python 生成器参数未初始化为默认值

python generator argument are not initialized as default value

也许这对某些人来说是一个非常简单的问题,我无法理解这是怎么回事。

我尝试使用 python generator 来解决问题。 但是,有时生成器似乎无法按我的预期工作。

下面的代码是非常简单的 python 生成器。 它接受整数 n 并设置 visited 作为参数。 visited 应在函数调用时初始化 set()

def simple_gen(n, visited=set()): 
    for i in range(0, n):
        if i not in visited:
            yield i
            visited.update([i])

a = simple_gen(10)
b = simple_gen(10)
print(f"a: {list(a)}")
print(f"b: {list(b)}")

但是,执行代码时,输​​出如下所示。 generator a 生成器值与我预期的一样,但 b 不是。 b 不生成任何值,它只是空值。

争论visited总是初始化为空集作为默认值。 但它看起来不像初始化。

a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b: []

我不明白为什么会这样。 有没有人知道这个,请告诉我。

我总是感谢你的帮助。

Python 的默认参数存储在 函数对象 中。这意味着它们只在定义函数时创建一次,不会在每次调用函数时都初始化。

因此,如果您修改可变参数,该修改 将在调用之间保留

这正是您在这里所做的:您有一个可变的默认参数,您在第一次调用时向其添加内容,而在第二次调用时 visited{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 开头。这就是为什么您通常不在 Python 中使用可变默认参数的原因,它很容易出错并且调试起来有些棘手。

将您的 visited 创建为普通局部变量,我看不出有任何理由将其作为参数。