2016-08-16 69 views
1

我有一个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);,这可以解决问题。

+5

你一遍又一遍地返回相同的数组对象,并且正在改变它的内容... – deceze

+3

与你的问题没有关系,但你应该放弃分号,并尽量不要w成一条'for'循环。 – fpietka

回答

4

正如指出的deceze你基本上结束了指向同一个实例列表的列表

为了使它更清晰,尝试

a = list(lexg(2,2)) 
a[0][0] = 3 
print(a) 

导致

[[3, 0], [3, 0], [3, 0], [3, 0], [3, 0], [3, 0]] 
+0

优秀。我改变了'收益率指数'这一行到'产量表(指数);'以便复制清单并因此避免该问题。 –