Python列表赋值异常疑问:欧拉计划15题代码调试问题
问题根源:Python列表的引用赋值特性
嘿,你遇到的这个问题完全是因为对Python里列表的赋值逻辑理解有偏差,这可是新手常踩的经典坑哦~
为什么原来的lijst = temp会出问题?
在Python中,列表属于可变对象。当你执行lijst = temp的时候,并不是把temp里的元素复制一份给lijst,而是让lijst和temp指向内存中同一个列表对象。打个比方,就像两个人共用一把钥匙,不管谁用这把钥匙开门、改变房间里的东西,另一个人看到的房间也会是改变后的样子。
回到你的代码:
当你在第二个for循环开头执行temp.append(1)时,因为lijst和temp指向同一个列表,所以lijst也会同步被加上这个1。后续计算temp[b] = lijst[b-1] + lijst[b]的时候,用的已经是被修改过的lijst,自然就得不到预期的杨辉三角序列了。
为什么改成列表推导式就正常了?
lijst = [a for a in temp]这种写法,本质是遍历temp中的每一个元素,然后创建一个全新的列表对象,把这些元素复制进去。这时候lijst和temp指向的是两个完全独立的列表,修改其中一个,另一个不会受到任何影响。
除了列表推导式,你还可以用这两种写法实现同样的效果:
lijst = temp.copy():调用列表的内置copy方法创建副本lijst = list(temp):通过list构造函数生成新列表
修正后的完整代码
lijst = [1, 1] temp = [1, 1] for a in range(2, 21): temp.append(1) for b in range(1, a): temp[b] = lijst[b-1] + lijst[b] lijst = [x for x in temp] # 或者用temp.copy()/list(temp) print(a, lijst)
这样运行就能得到你想要的杨辉三角序列啦~
内容的提问来源于stack exchange,提问作者tmfrk
相关产品推荐
相关产品推荐

