抄作业
Topic source尽管你的triangles函数在每次yield之后都试图更新L列表以表示杨辉三角的下一行,但这里有一个重要的问题:在Python中,列表是可变的(mutable),并且当你yield列表L时,你实际上是yield了列表的引用,而不是列表的副本。
这意味着,当外部代码(例如,一个循环)接收到这个yield出来的列表并可能在其后修改它时,下一次yield将会包含这个被修改过的列表(因为它仍然是同一个列表对象)。在你的情况下,由于你在yield之后直接修改了L,所以下次迭代时yield的将是已经被修改过的列表。
然而,由于你的yield发生在列表更新之前,所以在第一次迭代时,你实际上会得到正确的第一行[1]。但在后续的迭代中,你将会得到之前行被错误地更新后的结果,而不是新的杨辉三角行。
为了修复这个问题,你应该在每次迭代时都基于前一行创建一个新的列表,而不是修改现有的列表。你的函数应该像这样:
python
def triangles():
current_row = [1]
while True:
yield current_row
next_row = [1] + [current_row[i] + current_row[i + 1] for i in range(len(current_row) - 1)] + [1]
current_row = next_row
在这个修复后的版本中,current_row变量存储了当前行的列表,每次迭代时都会基于它来计算下一行,并将current_row更新为新的列表。这样,每次yield的都是一个新的、未被修改的列表。
- 1
却道天凉好个秋