我有一個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