也许对某人来说这是一个非常简单的问题,我不明白这是怎么回事。
我尝试使用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: []
我不明白为什么会这样。 有没有人知道这一点,请让我知道。
我一直感谢您的帮助。
答案 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
创建为普通的局部变量,我什至看不出为什么它甚至是参数。