Python发电机;两个表面上相同的程序工作方式不同



下面的程序[Python 3.4]是一个简单的埃拉托色尼筛子:

from itertools import *
def excl(ns,pr):
    return (i for i in ns if i%pr)
def sieve(ns):
    while True:
        pr=next(ns)
        yield pr
        ns=excl(ns,pr)
        # ns=(i for i in ns if i%pr)
r=list(islice(sieve(count(2)),10))

产生[2,3,5,7,11,13,17,19,23,29]。好的。取消内联excl()的行注释,并注释调用,得到[2,3,4,5,6,7,8,9,10,11]。为什么?

是否与在循环内修改迭代序列时预期的麻烦有关?

谢谢你的提示

您的问题是生成器表达式引用的pr是您在while循环的下一次迭代中修改的相同的pr,因此每个不能被前一个'素数'整除的数字都被视为'素数'。它本身修饰了pr,等等。在excl函数中,您引用的pr是作为参数传递的,它永远不会改变。

相关内容

最新更新