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
创建为普通局部变量,我看不出有任何理由将其作为参数。
也许这对某些人来说是一个非常简单的问题,我无法理解这是怎么回事。
我尝试使用 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
创建为普通局部变量,我看不出有任何理由将其作为参数。