昼伏君 2018-12-03 04:23 采纳率: 100%
浏览 753
已采纳

一个杨辉三角的生成器问题

杨辉三角如下:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]

实现一个生成器,不断输出下一行的列表,实现代码如下:

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

n = 0
results = []
for t in triangles():
    print(t)
    results.append(t)
    n = n + 1
    if n == 5:
        break

print(results)


运行结果:
图片说明

results.append(t)语句里的t和print(t)里的t应该一样呀,为何results中的列表末项会多一个零?

  • 写回答

1条回答 默认 最新

  • 小小月牙 2018-12-03 13:00
    关注

    你好,python中所有东西都可以视为对象,希望对你有所帮助

    yield N                                        #返回一个列表对象
    N.append(0)                                    #对当前对象添加 0 元素
    N = [N[i-1] + N[i] for i in range(len(N))]     #N变量重新绑定对象      
    

    这是由于你使用的是append()方法添加的 0 ,results里的上一个元素和你求下一行时 (N.append(0))的N绑定的对象是同一个,所以会改变;
    打印出来的是改变之前的,所以看不出,从results最后一个元素没有加0就可以看出来,那是因为还没有开始求下一行数。
    解决办法:
    yield N

    N = N + [0] #这里重新生成了一个列表对象,用N重新绑定
    N = [N[i-1] + N[i] for i in range(len(N))]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算