我有一个Python生成器lexg
它在每次迭代产生一个列表。该代码似乎在传统for
-loop意义的工作,那就是Python生成器列表
for i in lexg(2,2): print(i)
生产:
[2, 0]
[1, 1]
[1, 0]
[0, 2]
[0, 1]
[0, 0]
,但似乎在列表解析打破,那就是,无论
list(lexg(2,2))
和
[i for i in lexg(2,2)]
生产
[[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]]
然而,我希望list(lexg(2,2))
生产
[[2, 0]
[1, 1]
[1, 0]
[0, 2]
[0, 1]
[0, 0]]
代码为lexg
是:
def lexg(n, d):
exponent = [0] * n;
def looper(m, totalDegree):
r = reversed(range(0, d - totalDegree + 1));
for j in r:
exponent[n-m] = j;
if m == 1:
yield exponent;
else:
for x in looper(m-1, totalDegree+j): yield x
return looper(n, 0);
是什么原因造成的空输出?
编辑/解决方案
的问题,下面的建议,是同样的名单在发电机的每一步返回的事实。因此,一种解决方案是在返回之前复制列表。例如,我已将yield exponent;
行lexg
更改为yield list(exponent);
,这可以解决问题。
你一遍又一遍地返回相同的数组对象,并且正在改变它的内容... – deceze
与你的问题没有关系,但你应该放弃分号,并尽量不要w成一条'for'循环。 – fpietka