10

可能重复:
python 的可变长度参数(*args)是否在函数调用时扩展生成器?

假设您有这样的功能:

def give_me_many(*elements):
   #do something...

你这样称呼它:

generator_expr = (... for ... in ... )
give_me_many(*generator_expr)

元素会被延迟调用,还是生成器会在函数执行之前遍历所有可能的数百万个元素?

4

3 回答 3

14

参数总是作为元组和/或字典传递给函数,因此传入的任何内容*args都将转换为元组或**kwargs转换为字典。如果kwargs已经是字典,则制作副本。元组是不可变的,因此args不需要复制,除非它发生变化(通过包含其他位置参数或删除命名位置参数的一些参数),但它将从任何其他序列类型转换为元组。

于 2012-08-16T12:06:18.777 回答
12

不,他们不是:

>>> def noisy(n):
...   for i in range(n):
...     print i
...     yield i
... 
>>> def test(*args):
...   print "in test"
...   for arg in args:
...     print arg
... 
>>> test(*noisy(4))
0
1
2
3
in test
0
1
2
3
于 2012-08-16T12:03:41.993 回答
0

文档

这些参数将被包裹在一个元组中

这意味着生成器被提前评估。

于 2012-08-16T12:41:50.273 回答