为了账号安全,请及时绑定邮箱和手机立即绑定

列出生成器和循环之间的区别

列出生成器和循环之间的区别

临摹微笑 2021-06-16 17:49:38
使用列表理解(或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 号不同。


查看完整回答
反对 回复 2021-06-29
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号