Python:生成列表的生成器,list()和列表理解的问题

时间:2017-11-07 16:33:42

标签: python list generator mutable

假设我想编写一个返回列表的生成器,例如迭代列表排列。采用以下简单示例:

def list_gen():
    foo = [1,2,3,4]
    for i in range(5, 9):
        foo[1] = i
        yield foo


bar = list(list_gen())
print(bar)
bar = [l for l in list_gen()]
print(bar)

for l in list_gen():
    print(l, end=' ')

输出结果为:

[[1, 8, 3, 4], [1, 8, 3, 4], [1, 8, 3, 4], [1, 8, 3, 4]]
[[1, 8, 3, 4], [1, 8, 3, 4], [1, 8, 3, 4], [1, 8, 3, 4]]
[1, 5, 3, 4] [1, 6, 3, 4] [1, 7, 3, 4] [1, 8, 3, 4] 

所以使用for循环一切都按预期工作,但是使用list()或list comprehension,所有值都等于最后一个。据我了解,这是因为列表是可变的,并且bar的所有元素都指向同一个对象。

一种可能的解决方法可能是bar = [list(l) for l in list_gen()],但似乎相当丑陋。有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

针对此特定问题的简单解决方案是返回新列表,而不是foo对象。

def list_gen():
    foo = [1,2,3,4]
    for i in range(5, 9):
        foo[1] = i
        yield list(foo)

免责声明:我不经常使用发电机,因此这可能违反最佳做法。但它解决了这个问题。