Python生成器不提供nex值
我目前正忙于处理python生成器,试图理解它们 我创建了以下简单函数: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
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()
,但老实说,这是生成器函数如何工作的一个基本方面。