Python生成器到lis

2024-04-26 04:40:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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);,这就解决了问题。你知道吗


Tags: 代码in列表fordef传统解决方案list
1条回答
网友
1楼 · 发布于 2024-04-26 04:40:12

正如deceze所指出的那样,实际上最终会得到一个指向同一实例的列表列表

更清楚地说,试试这个

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

结果是

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

相关问题 更多 >