Python 生成器列表
Python generator to list
我有一个 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 );
什么导致输出为空?
Edit/Solution
如下所示,问题在于生成器的每一步都返回相同的列表。因此,一种解决方案是在返回之前复制列表。比如我把lexg
的yield 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 生成器 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 );
什么导致输出为空?
Edit/Solution
如下所示,问题在于生成器的每一步都返回相同的列表。因此,一种解决方案是在返回之前复制列表。比如我把lexg
的yield 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]]