Discuss / Python / 这里yield传值出去为什么一定要.copy()?

这里yield传值出去为什么一定要.copy()?

Topic source

Sergio75

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

def triangles(): L = [] T = [] while True: L.append(1) T.append(1) for i,l in enumerate(L): if i<len(L)-1 and i>0: T[i] = L[i-1] +l L = T.copy() yield L.copy()

这个地方很神奇,如果把最后一个L.copy()改成L的话,打印出来的结果是对的,但是results里面的结果却是错的,好像是中间循环没有执行完全就被append到了results里。这里是和引用有关系么?

Sergio75

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

在vscode里调试了一番之后结论如下: yield 传值到t时,并不是传了值本身,而是L这个变量的引用,当yield后再进循环append时,results中的最后一个项是L而不是它的值,所以会随着起变化而变化,但是一旦L内的值变更而不是增加了之后,results中最后一项(即前一个传过来的L)就停止了变化。具体机理不明


  • 1

Reply