Python:产生列表的生成器,list() 和列表理解的问题
Python: Generator that yields lists, problems with list() and list comprehension
假设我想编写一个生成器,returns 列表,例如迭代列表排列。举个简单的例子:
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() 或列表理解,所有值都等于最后一个。据我了解,这是因为列表是可变的,并且 bar 的所有元素都指向同一个对象。
一种可能的解决方法是 bar = [list(l) for l in list_gen()]
,但它看起来相当丑陋。有没有更好的方法来处理这个问题?
这个特定问题的一个简单解决方案是 return 一个新列表,而不是 foo
对象。
def list_gen():
foo = [1,2,3,4]
for i in range(5, 9):
foo[1] = i
yield list(foo)
免责声明:我不经常使用生成器,因此这可能违反最佳实践。但它解决了问题。
假设我想编写一个生成器,returns 列表,例如迭代列表排列。举个简单的例子:
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() 或列表理解,所有值都等于最后一个。据我了解,这是因为列表是可变的,并且 bar 的所有元素都指向同一个对象。
一种可能的解决方法是 bar = [list(l) for l in list_gen()]
,但它看起来相当丑陋。有没有更好的方法来处理这个问题?
这个特定问题的一个简单解决方案是 return 一个新列表,而不是 foo
对象。
def list_gen():
foo = [1,2,3,4]
for i in range(5, 9):
foo[1] = i
yield list(foo)
免责声明:我不经常使用生成器,因此这可能违反最佳实践。但它解决了问题。