Python list-comprehensions问题:转列表一次后返回空
异常问题产生原因
- 当前的语法写法本质并非列表推导式:Python语法中,使用圆括号包裹的
str(x) for x in values结构是生成器表达式,执行后会直接返回生成器对象,不会在内存中生成完整的列表结果。 - 生成器对象具备一次性耗尽的特性:生成器是惰性求值的迭代器,不会提前缓存所有生成结果,只有被迭代时才会逐个计算产出值;当你第一次执行
list(vv)时,已经完整遍历了整个生成器,将所有元素全部取出,此时生成器内部已经没有剩余可迭代的值,后续再对同一个生成器执行list()转换,自然会返回空列表。
正确的列表推导式调整方式
列表推导式的核心语法特征是用方括号包裹推导逻辑,而非圆括号,调整后的可正常复用的代码示例:
values = [3, "fasdf", 99] # 方括号包裹推导逻辑,直接返回列表对象 vv = [str(x) for x in values] # 直接查看返回对象类型 type(vv) # 输出结果: <class 'list'> # 多次对同一个列表执行转列表操作,结果不会变化 list(vv) # 输出结果: ['3', 'fasdf', '99'] list(vv) # 输出结果: ['3', 'fasdf', '99']
补充说明:如果确实需要使用生成器表达式实现惰性求值,需注意每次使用时重新生成生成器实例,不要对已经完成过一次完整遍历的生成器重复执行取值操作。
内容的提问来源于stack exchange,提问作者yonilobo
相关产品推荐
相关产品推荐

