美文网首页
Python中yield的中断机制导致list.append之后

Python中yield的中断机制导致list.append之后

作者: JackKun | 来源:发表于2019-01-07 20:44 被阅读0次

看示例:

# 杨辉三角
def triangles():
    L = [1]
    while True:
        print("yield 变量的新地址 ->", id(L))
        yield L
        L1 = []
        L.insert(0, 0)
        L.insert(len(L), 0)
        #相邻数字相加
        for x in range(len(L)-1):
            L1.append(L[x]+L[x+1])
        print("已存到results里的地址->", id(L))
        print("此时该地址对应的值改变了!->", L)
        L = L1
    return 'done'


results = []
ids = []
generator1 = triangles()
for i in range(3):
    t = next(generator1)
    print("此时yield变量L的值 ->", t)
    print("此时t指向L的地址=L ->", id(t))
    results.append(t)
    ids.append(id(t))
    print("此时results存的值  ->", results)
    print("此时t_ids存的值    ->", ids)
    print("###################################")
print(results)

输出结果:

yield 变量的新地址 -> 2130388136200
此时yield变量L的值 -> [1]
此时t指向L的地址=L -> 2130388136200
此时results存的值  -> [[1]]
此时t_ids存的值    -> [2130388136200]
###################################
已存到results里的地址-> 2130388136200
此时该地址对应的值改变了!-> [0, 1, 0]
yield 变量的新地址 -> 2130387390344
此时yield变量L的值 -> [1, 1]
此时t指向L的地址=L -> 2130387390344
此时results存的值  -> [[0, 1, 0], [1, 1]]
此时t_ids存的值    -> [2130388136200, 2130387390344]
###################################
已存到results里的地址-> 2130387390344
此时该地址对应的值改变了!-> [0, 1, 1, 0]
yield 变量的新地址 -> 2130388177160
此时yield变量L的值 -> [1, 2, 1]
此时t指向L的地址=L -> 2130388177160
此时results存的值  -> [[0, 1, 0], [0, 1, 1, 0], [1, 2, 1]]
此时t_ids存的值    -> [2130388136200, 2130387390344, 2130388177160]
###################################
[[0, 1, 0], [0, 1, 1, 0], [1, 2, 1]]

上面print(results)预期的结果应该是:[[1], [1, 1], [1, 2, 1]]
但实际输出结果是:[[0, 1, 0], [0, 1, 1, 0], [1, 2, 1]]
这里主要是因为yield有中断机制,运行到这里,就会停掉,当再次调用next()时,又会从中断的地方继续执行下去。results里记录的t指向的是L的地址,再次调用next()之后,代码往下执行,当L前后insert两个零之后L的值就改变的,因此results里对应的t的值也就改变了,最后导致了输出结果错误。


JackKun的简书

相关文章

网友评论

      本文标题:Python中yield的中断机制导致list.append之后

      本文链接:https://www.haomeiwen.com/subject/znuprqtx.html