2016-08-16 71 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

優秀。我改變了'收益率指數'這一行到'產量表(指數);'以便複製清單並因此避免該問題。 –