当你在像这样的列表理解中提供一个旧列表的功能时
my_new_list = [x * 2 for x in list_maker()]
每次抓取新的list_maker()
时,会被x
调用吗?
我想知道,因为我想知道这样做是否更有效
my_old_list = list_maker()
my_new_list = [x * 2 for x in my_old_list]
谢谢!
答案 0 :(得分:4)
答案,就像大多数问题"哪个更有效?","它取决于"。
传统上,list_maker
将被调用一次,因此无论是在列表推理中还是在外部调用它并分配给变量都没有区别(1)。
然而(这就是@PeterWood所指的),list_maker
可能是generator,这会导致它重复输入(这不完全是与重复调用相同,但可能足够接近)。 (另见PEP 255。)
然而,哪个更有效的问题并不明确 - 返回整个列表的常规函数将使用比生成器更多的内存,这可能会或可能不会更昂贵。
(1)除了用于存储list_maker
结果的内存可以在列表compreshension竞争后立即释放,my_new_list
必须首先超出范围未引用的范围。< / p>