gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:57 24 4
gpt4 key购买 nike

看着这个answer ,似乎使用列表理解(或 for 循环与 append)等同于在迭代器上调用 list(..)。自 generators are iterators我也希望发电机也一样。但是,如果你运行

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)

It prints :

Direct iteration
[1, 2]
[2, 1]
Listing
[1, 2]
[1, 2]

为什么会这样?

最佳答案

您正在一遍又一遍地修改和生成相同的列表 xs。当生成器运行时,列表内容会发生变化。它看起来可以正常工作,因为虽然每个 print(x) 打印相同的列表对象,但该对象每次都有不同的内容。

另一方面,第二个循环运行生成器直至完成并收集所有列表引用。 然后它打印出列表——除了它们都是相同的列表,所以每一行都是相同的!

将两行 print(x) 更改为 print(x, id(x)) 您就会明白我的意思了。 ID 号将全部相同。

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 号不同。

关于python - 列出生成器和循环之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52527810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com