Discuss / Python / 抄作业

抄作业

Topic source
#GPT写的:
def triangles():
    L = [1]
    while True:
        yield L
        L = [1] + [L[i] + L[i + 1] for i in range(len(L) - 1)] + [1]

Apeex

#2 Created at ... [Delete] [Delete and Lock User]

还是GPT吊啊

GPT牛逼

这还要啥自行车

UTOPIA

#5 Created at ... [Delete] [Delete and Lock User]

尽管你的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

Reply