看示例:
# 杨辉三角
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的值也就改变了,最后导致了输出结果错误。

网友评论