Discuss / Python / 求大佬解答

求大佬解答

Topic source

为啥这个前几行的结果 后面多加了个0啊

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

5行时输出如下:

[1, 1, 0]

[1, 2, 1, 0]

[1, 3, 3, 1, 0]

[1, 4, 6, 4, 1, 0]

[1, 5, 10, 10, 5, 1]

Little_咪

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

你应该先yield a,再a.append(0)

ultramora

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

因为在前面yield 的是L这个变量

L.append L.assert L.extend 函数都不修改L的id

在第二次进入generator的时候 L.append(0)会修改之前的L (也就是iteration里面的t)

但是最后一行的赋值操作修改了L的id 所以不会发生变化了

具体的你可以debug一下 就很明显了

简短地说,就是yield返回的应该是没有append(0)的列表,而楼主返回的是加了0的列表,应该在append(0)之前先复制一个新的列表返回

Silences龙

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

借楼一用!

我用debug测试了下,发现生成器返回的结果是正确的,但是在for循环打印的时候出错了,

发现问题出在了  append() 这个内置函数上,生成器返回结果传给变量t,调用append()添加的时候,他没有使用变量t 的指向,而是指向了生成器中中间产生的列表:验证代码如下:

def triangles():    a = [1]    while 1:        yield a      # 复制列表 此处a 替换为a[:] 后,循环添加到新列表中结果也符合要求,这个原因,请各位大神帮我解释?        a.append(0)     # 先进行补位,补位为0,也只能为零        a = [a[i-1] + a[i] for i in range(0, len(a))]      # 列表生成式
n = 0
for t in triangles():
    print(t)
    n += 1
    if n == 10:
        break

# 以下代码需要替换后结果才正确
n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break
for t in results:
    print(t)



  • 1

Reply