python 这个生成器的调用为什么会有不一样的结果1genr().__next__()2f=genr();f.__next__()

icedrabb 发布于 07/12 13:46
阅读 192
收藏 0

def genr():
    i=0
    while 1:
        i+=1
        yield i

genr().__next__()

#out 始终=1

f=genr();f.__next__()

#out自加1

为什么会这样啊,是变量空间问题吗?

加载中
0
tcxu
tcxu

测试代码:

def genr():
    i=0
    while 1:
        i+=1
        yield i
print(genr().__next__())
print(genr().__next__())
f = genr()
print(f.__next__())
print(f.__next__())
print(f.__next__())

输出:

1
1
1
2
3

关键代码行解释:

genr().__next__()  
每次都从新调用 genr(),每次其局部变量 i 都用 0 被初始化一次, 然后仅运行 while 循环一次, 因此每次都输出 1。

f = genr() 
将方法 genr()的代码, 通过引用 f 以代码块的形式存到栈里。其局部变量 i 被初始化为 0。
f.__next__() 

f.__next__() 

f.__next__() 
然后,运行 while 循环一次,由于是到同一个地方去持续运行 while 循环, 使得每次运行 while 循环  i 的值持续自增 1 ( 输出 1,2,3)。

 

 

返回顶部
顶部