【问题标题】:Python generator to list要列出的 Python 生成器
【发布时间】:2016-12-22 19:13:16
【问题描述】:

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

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);,问题就解决了。

【问题讨论】:

  • 你一遍又一遍地返回相同的数组对象,并且正在改变它的内容......
  • 与你的问题无关,但你应该去掉分号,尽量不要写一行for循环。

标签: python recursion generator yield-keyword


【解决方案1】:

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

为了更清楚,尝试一下

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

导致

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

【讨论】:

  • 优秀。我已经更改了“产量指数”这一行;到'收益率列表(指数);'为了复制列表,从而避免问题。
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 2013-10-02
  • 2012-10-07
  • 2015-07-06
  • 2015-01-16
  • 2014-08-28
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多