Python生成器首次使用后为空,运行代码得到空列表问题咨询
为什么Python生成器在首次转为列表后再次使用会返回空列表?
嘿,这个问题正好戳中了Python生成器的一个关键特性——生成器是一次性的迭代器,一旦被遍历耗尽,就再也拿不出新元素啦!
咱们来拆解下你的代码问题:
- 你定义的
upper_case_name = (name.upper() for name in Aircraft_typelst)是一个生成器表达式,它不像列表会提前把所有元素存在内存里,而是在每次迭代的时候才临时生成一个值。 - 当你第一次执行
print(list(upper_case_name))时,Python会从头到尾遍历这个生成器,把每一个生成的大写名字都取出来拼成列表。这时候,生成器内部的“指针”已经走到了最后,没有剩下任何待生成的元素了——它已经被耗尽了。 - 之后你再用
reverse = (rev[::-1]for rev in upper_case_name)去迭代这个已经空掉的生成器时,自然没有任何元素可以处理,所以list(reverse)返回的就是空列表咯。
解决办法
如果需要多次复用这些值,有两种常见思路:
- 转成列表保存:把生成器换成列表推导式,提前把所有值存在内存里,这样就能反复使用了:
Aircraft_typelst = ['Boeing','Airbus','MiJ','goes'] upper_case_list = [name.upper() for name in Aircraft_typelst] print(upper_case_list) # 输出: ['BOEING', 'AIRBUS', 'MIJ', 'GOES'] reverse_list = [rev[::-1] for rev in upper_case_list] print(reverse_list) # 输出: ['GNIOEB', 'SUBRIA', 'JIM', 'SEOG'] - 重新生成生成器:如果数据量很大,不想占用太多内存,可以把生成器逻辑包装成函数,每次需要的时候调用函数生成一个新的生成器:
def generate_upper_names(lst): return (name.upper() for name in lst) Aircraft_typelst = ['Boeing','Airbus','MiJ','goes'] # 第一次生成并使用生成器 print(list(generate_upper_names(Aircraft_typelst))) # 第二次生成新的生成器来处理反转 reverse_gen = (rev[::-1] for rev in generate_upper_names(Aircraft_typelst)) print(list(reverse_gen))
内容的提问来源于stack exchange,提问作者Satyam
相关产品推荐
相关产品推荐

