参数调用是否是惰性的?

10

1
https://dev59.com/e2435IYBdhLWcg3w1z0t - georg
@thg435 我不得不同意。 - erikbstack
3个回答

14

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


听起来很合理,但我仍然不明白与问题的联系。 - erikbstack
1
@erikb85,调用tuple(..)(或 dict(..))进行转换将迫使求值整个生成器。 - huon
Timeit似乎证实调用f(*some_tuple)比调用f(*some_list)稍微快一些。哦。 - Lauritz V. Thaulow

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

0

文档中提到:

这些参数将被封装在元组中

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接