我相信我被嵌套范围规则和列表理解的某种组合所困扰。 Jeremy Hylton 的博客文章暗示了原因,但我不太了解 CPython 的实现,无法弄清楚如何解决这个问题。
这是一个(过于复杂?)示例。如果人们有一个更简单的演示它,我想听听。问题:使用 next() 的列表推导填充了上一次迭代的结果。
编辑:问题:
这到底是怎么回事,我该如何解决?我必须使用标准 for 循环吗?显然,该函数运行了正确的次数,但列表推导式以最终值结束,而不是每个循环的结果。
一些假设:
- 发电机?
- 懒惰填写列表推导?
代码
import itertools
def digit(n):
digit_list = [ (x,False) for x in xrange(1,n+1)]
digit_list[0] = (1,True)
return itertools.cycle ( digit_list)
>>> D = 数字(5) >>> [D.next() for x in range(5)] ## 这个列表理解按预期工作 [(1,真),(2,假),(3,假),(4,假),(5,假)]
class counter(object):
def __init__(self):
self.counter = [ digit(4) for ii in range(2) ]
self.totalcount=0
self.display = [0,] * 2
def next(self):
self.totalcount += 1
self.display[-1] = self.counter[-1].next()[0]
print self.totalcount, self.display
return self.display
def next2(self,*args):
self._cycle(1)
self.totalcount += 1
print self.totalcount, self.display
return self.display
def _cycle(self,digit):
d,first = self.counter[digit].next()
#print digit, d, first
#print self._display
self.display[digit] = d
if first and digit > 0:
self._cycle(digit-1)
C = counter()
[C.next() for x in range(5)]
[C.next2() for x in range(5)]
输出
在 [44] 中:[C.next() for x in range(6)] 1 [0, 1] 2 [0, 2] 3 [0, 3] 4 [0, 4] 5 [0, 1] 6 [0, 2] 输出[44]:[[0, 2], [0, 2], [0, 2], [0, 2], [0, 2], [0, 2]] 在 [45] 中:[C.next2() for x in range(6)] 7 [0, 3] 8 [0, 4] 9 [1, 1] 10 [1, 2] 11 [1, 3] 12 [1, 4] 输出[45]:[[1, 4], [1, 4], [1, 4], [1, 4], [1, 4], [1, 4]] # 这应该是:[[0,3],[0,4]....[1,4]] 或类似的