关于廖雪峰python3教程中生成器的习题

来自廖雪峰的python3教程——生成器的课后练习,题目可点击以下网址查看:
廖雪峰的python3教程——生成器

在评论列表中看到了这样的答案:

def triangles():
    L = [1]
    while True:
        yield L
        L.append(0)
        L = [L[a - 1] + L[a] for a in range(len(L))]

初看没什么问题,但是执行的时候却显示测试未通过。

原来是results的结果不对,预想中的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]],但实际的结果是results=[[1, 0], [1, 1, 0], [1, 2, 1, 0], [1, 3, 3, 1, 0], [1, 4, 6, 4, 1, 0], [1, 5, 10, 10, 5, 1, 0], [1, 6, 15, 20, 15, 6, 1, 0], [1, 7, 21, 35, 35, 21, 7, 1, 0], [1, 8, 28, 56, 70, 56, 28, 8, 1, 0], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]]。

今天空闲时把代码调试了一下,发现是列表append列表的原因。

举例:

L = [1,2,3,4]
O = [5,6,7]
L.append(O)
print(L) #结果是[1,2,3,4,[5,6,7]]

#这时给列表O添加一个元素
O.append(8)
print(L) #结果是[1,2,3,4,[5,6,7,8]]

#若使用O = O + [9]
O = O + [9] #此时O = [5,6,7,8,9]
print(L) #发现L仍为[1,2,3,4,[5,6,7,8]]

在廖雪峰的课后题中,results,t,L都是列表。

yield返回L的值给t后,每一次迭代t的值正确显示,但是在triangles中,yield之后L是做了append(0)操作的,因此results.append(t)中的t指向的是append(0)后的L。

所以除了最后一个元素还没来得及append(0)外,results其余所有的元素都相当于做了append(0)操作。

解决办法:
把 L.append(0) 改成 L = L + [0] 就通过测试了。


有不足之处,还请大神们指正。

你可能感兴趣的:(python)