def triangles():
L = [1] #方法一
while True:
yield L
L = L + [0] #为何不能用L.append(0)?
L = [L[i] + L[i - 1] for i in range(len(L))]
# s = [1] #方法二
# while True:
# yield s[:] #为何一定要加[:]而不能直接yeild s?
# s.append(0)
# l = s[:]
# for i in range(len(s)):
# l[i] = s[i] + s[i - 1]
# s = l[:]
```python
``` # 期待输出:
# [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]
n = 0
results = []
for t in triangles():
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('测试失败!')
L = L + [0] 会产生一个新列表,在新列表中添加0。不会影响 yield L 返回的列表
而用L.append(0) 是在原列表中添加0,不会产生一个新列表。原列表用 yield L 返回并添加到 results 中,
L列表就与上一次添加到 results 中的列表是同一个地址, 对L列表中添加0,上一次添加到 results 中的列表也就添加了0。
解决方式就是你方法二那样。用 yield L[:]复制出一个新列表,返回新列表添加到 results 中。
这样L列表就与上一次添加到 results 中的列表不是同一个地址了,对L列表中添加0,不会影响上一次添加到 results 中的列表。
如有帮助,望采纳!谢谢!