廖雪峰 python生成器的一个坑 希望有哪位同志解答下

-- coding: utf-8 --

def triangles():
L=[1]

while True:
yield L
L.insert(0,0)
L.append(0)
L=[L[i]+L[i+1] for i in range(len(L)-1)]
n = 0
results = []
for t in triangles():
print(t)
results.append(t)

n = n + 1
if n == 10:
    break

for t in results:
print(t)

if results == [
[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1],
[1, 7, 21, 35, 35, 21, 7, 1],
[1, 8, 28, 56, 70, 56, 28, 8, 1],
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
print('测试通过!')
else:
print('测试失败!')

代码如上
为什么 将 t 添加到result中 以后 t 的每一行首尾都多了一个 0
刚开始学习python 希望 了解的同志详细解答下

这个咱知道,主要是因为在yield L后又对L进行了原址修改(L.insert(0, 0),L.append(0)),使得生成的t(L)也随之变化,可考虑在生成时做个拷贝,以防止原址修改带来的副作用(side effect)

def triangles():
    '''
    生成器triangles,每次产出更新后的列表L,列表L的更新规则如下:
    前后补0,新列表每项元素为补0后列表相邻元素之和,列表规模变化为n→n+2→n+1
    '''
    L=[1]
    while True:
        yield [i for i in L]
        L.insert(0,0)
        L.append(0)
        L=[L[i]+L[i+1] for i in range(len(L)-1)]

这种一般都是问原作者或者原代码创作人,直接解答比较省力....旁人没有这个语境,回答不免有偏薄