Python生成器不提供nex值

Python生成器不提供nex值,python,function,printing,generator,Python,Function,Printing,Generator,我目前正忙于处理python生成器,试图理解它们 我创建了以下简单函数: def simpleGeneratorFun(): yield 1 yield 2 yield 3 yield 4 然后: 逻辑上,它的输出是: 1 2 3 4 将它们分配给变量似乎是以正确的方式工作的 b = simpleGeneratorFun() print(id(b)) c = simpleGeneratorFun() print(id(c)) 输出: 122357576

我目前正忙于处理python生成器,试图理解它们

我创建了以下简单函数:

def simpleGeneratorFun(): 
    yield 1
    yield 2
    yield 3
    yield 4
然后:

逻辑上,它的输出是:

1
2
3
4 
将它们分配给变量似乎是以正确的方式工作的

b = simpleGeneratorFun()
print(id(b))
c = simpleGeneratorFun()
print(id(c))
输出:

122357576
122356552
1
1
2
2
3
3
4
4
122355912 1
122355912 1 
122355912 1 1 1
122355912 1 2 3 4
然后:

print(next(b))
print(next(c))
print(next(b))
print(next(c))
print(next(b))
print(next(c))
print(next(b))
print(next(c))
输出:

122357576
122356552
1
1
2
2
3
3
4
4
122355912 1
122355912 1 
122355912 1 1 1
122355912 1 2 3 4
因此,我决定如下:

print(id(simpleGeneratorFun()),next(simpleGeneratorFun()))
print(id(simpleGeneratorFun()),next(simpleGeneratorFun()))
输出:

122357576
122356552
1
1
2
2
3
3
4
4
122355912 1
122355912 1 
122355912 1 1 1
122355912 1 2 3 4
奇怪的是,尽管这次我调用了完全相同的函数(由de ID保证),但它似乎并没有保存生成器的状态

接下来我尝试的是:

print(id(simpleGeneratorFun()),next(simpleGeneratorFun()),next(simpleGeneratorFun()),next(simpleGeneratorFun()))
输出:

122357576
122356552
1
1
2
2
3
3
4
4
122355912 1
122355912 1 
122355912 1 1 1
122355912 1 2 3 4
但如果我将其编码为:

d = simpleGeneratorFun()
print(id(d),next(d),next(d),next(d),next(d))
输出:

122357576
122356552
1
1
2
2
3
3
4
4
122355912 1
122355912 1 
122355912 1 1 1
122355912 1 2 3 4

为什么会这样?它不应该继续这个系列而不是重新开始吗?

id
与您正在调用的函数无关。在任何情况下,每次调用生成器函数时,它都会返回一个新的生成器对象。这就是重点。那么,为什么在d上调用next会返回不同的值,而在simplegeneratorfun()上调用next则不会返回不同的值呢?因为
d
每次调用
next
时都是同一个对象。每次执行
next(simpleGeneratorFunction())
时,您都会创建一个新的生成器对象,该对象会传递给
next
,因为它是新的,所以总是从一开始就开始,而且因为您从未在任何地方保留它,所以在我认为ID函数确保它是同一个函数之后,它会立即被垃圾收集。只是给同一个ID分配了一个新的生成器?是否有其他方法检查此问题?
id
为对象的生命周期提供唯一的编号。您使用的是
id
,但在调用
id
之间,对象不再存在,因此该号码被重新使用。因此,请尝试
g1=SimpleGeneratorFunction();g2=SimpleGeneratorFunction();print(g1==g2
,或者更简单地说,
SimpleGeneratorFunction()是SimpleGeneratorFunction()
,但老实说,这是生成器函数如何工作的一个基本方面。