使用列表理解(或for循环append)等同于调用list(..)迭代器。由于生成器也是迭代器,我希望生成器也是如此。但是,如果您运行def permute(xs, count, low = 0): if low + 1 >= count: yield xs else: for p in permute(xs, low + 1): yield p for i in range(low + 1, count): xs[low], xs[i] = xs[i], xs[low] for p in permute(xs, low + 1): yield p xs[low], xs[i] = xs[i], xs[low]print("Direct iteration")for x in permute([1, 2], 2): print(x)print("Listing")for x in list(permute([1, 2], 2)): print(x)它打印:Direct iteration[1, 2][2, 1]Listing[1, 2][1, 2]为什么会这样?
1 回答

桃花长相依
TA贡献1860条经验 获得超8个赞
您正在xs一遍又一遍地修改和生成相同的列表。当生成器运行时,列表内容会发生变化。看起来它正在工作,因为虽然每个print(x)打印相同的列表对象,但该对象每次都有不同的内容。
另一方面,第二个循环运行生成器直到完成并收集所有列表引用。然后它打印出列表——除了它们都是相同的列表,所以每一行都是一样的!
将两print(x)行更改为print(x, id(x)),您就会明白我的意思。身份证号码将全部相同。
Direct iteration
[1, 2] 140685039497928
[2, 1] 140685039497928
Listing
[1, 2] 140685039497736
[1, 2] 140685039497736
快速修复是生成列表的副本而不是原始列表。的yield p很好,但yield xs应该变成:
yield xs[:]
通过该修复,结果如预期:
Direct iteration
[1, 2] 140449546108424
[2, 1] 140449546108744
Listing
[1, 2] 140449546108424
[2, 1] 140449546108808
两个循环的结果相同,ID 号不同。
添加回答
举报
0/150
提交
取消