Python的可变长度参数(*args)在函数调用时会展开生成器吗?

10 投票
3 回答
4316 浏览
提问于 2025-04-16 12:56

考虑以下的Python代码:

def f(*args):
    for a in args:
        pass

foo = ['foo', 'bar', 'baz']

# Python generator expressions FTW
gen = (f for f in foo)

f(*gen)

在调用时,*args会自动展开生成器吗?换句话说,在f(*gen)中,我是不是对gen进行了两次迭代,一次是为了展开*args,另一次是为了遍历参数?还是说生成器保持原样,迭代只在for循环中进行一次?

3 个回答

-1

其实你并不需要

gen = (f for f in foo)

调用

f(*foo)

会输出

('foo', 'bar', 'baz')
2

为什么不去看看在 f() 里面的 gen 是什么呢?可以在第一行加上 print args。如果它还是一个生成器对象,打印出来就能告诉你了。我觉得参数解包应该会把它变成一个元组。

14

当你调用这个生成器函数的时候,它会被展开,你可以很容易地验证这一点:

def f(*args):
    print(args)
foo = ['foo', 'bar', 'baz']
gen = (f for f in foo)
f(*gen)

将会打印出

('foo', 'bar', 'baz')

撰写回答