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

使用列表理解(或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]

为什么会这样?


临摹微笑
浏览 162回答 1
1回答

桃花长相依

您正在xs一遍又一遍地修改和生成相同的列表。当生成器运行时,列表内容会发生变化。看起来它正在工作,因为虽然每个print(x)打印相同的列表对象,但该对象每次都有不同的内容。另一方面,第二个循环运行生成器直到完成并收集所有列表引用。然后它打印出列表——除了它们都是相同的列表,所以每一行都是一样的!将两print(x)行更改为print(x, id(x)),您就会明白我的意思。身份证号码将全部相同。Direct iteration[1, 2] 140685039497928[2, 1] 140685039497928Listing[1, 2] 140685039497736[1, 2] 140685039497736快速修复是生成列表的副本而不是原始列表。的yield p很好,但yield xs应该变成:yield xs[:]通过该修复,结果如预期:Direct iteration[1, 2] 140449546108424[2, 1] 140449546108744Listing[1, 2] 140449546108424[2, 1] 140449546108808两个循环的结果相同,ID 号不同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python