gpt4 book ai didi

要列出的 Python 生成器

转载 作者:太空宇宙 更新时间:2023-11-04 10:09:57 29 4
gpt4 key购买 nike

我有一个 Python 生成器 lexg,它在每次迭代时生成一个列表。该代码似乎在传统的 for 循环意义上工作,即

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 );

是什么导致了空输出?

编辑/解决方案

如下所示,问题在于生成器的每一步都返回相同的列表。因此,一种解决方案是在返回之前复制列表。例如,我已将 lexgyield exponent; 行更改为 yield list(exponent);,从而解决了问题。

最佳答案

正如 deceze 指出的那样你最终得到一个指向同一个实例的列表列表

为了更清楚,试试看

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

结果

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

关于要列出的 Python 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38974429/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com