*参数是否称为懒惰?

时间:2012-08-16 11:59:44

标签: python lazy-evaluation generator-expression

  

可能重复:
  Do python's variable length arguments (*args) expand a generator at function call time?

假设您有这样的功能:

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

你这样称呼它:

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

这些元素是否会被懒惰地调用,或者在执行函数之前,生成器是否会运行所有可能数百万个元素?

3 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分: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

答案 2 :(得分:0)

The docs

  

这些参数将包含在元组中

表示早期评估生成器。