python generator参数未初始化为默认值

时间:2020-03-04 07:17:07

标签: python arguments generator 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)}")

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

参数visited始终初始化为空,并将其设置为默认值。 但看起来不像是初始化。

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

我不明白为什么会这样。 有没有人知道这一点,请让我知道。

我一直感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

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

这就是您在这里所做的:您有一个可变的默认参数,在第一个调用中向其添加内容,在第二个调用中,type MyDoc struct { Number uint64 `bson:"_id"` Timestamp int64 `bson:"time"` } // I just want to know whether uint64 overflows or not. func main() { mydoc := &MyDoc{ Number: math.MaxUint64, Timestamp: time.Now().UnixNano(), } v, err := bson.Marshal(mydoc) if err != nil { panic(err) } fmt.Println(v) } panic: 18446744073709551615 overflows int64 [recovered] panic: 18446744073709551615 overflows int64 开始。这就是为什么您通常在Python中不使用可变的默认参数的原因,它非常容易出错并且调试起来有些棘手。

将您的visited创建为普通的局部变量,我什至看不出为什么它甚至是参数。