Python 3.6中range()函数执行异常及输出不符问题咨询
问题分析与解决方法
咱们先一步步拆解你的问题,找到根源和解决办法:
1. 最初语法错误的原因
你一开始把所有语句挤在了同一行,比如def fn(): theList = [] for rev...,Python解析器根本搞不清语句的边界和函数内的代码结构,所以报错。你说添加逗号修复了,应该是调整了语句的分隔方式(比如换成换行或者分号),让代码变成了可执行的结构,大概修复后是这样的:
def fn(): theList = [] for rev in range(5, 0, -1): theList.append(rev) print(theList) fn()
这时候代码能跑了,但因为你把print放在了循环内部,每次添加元素后就会打印当前列表,所以才会输出[5]、[5,4]直到[5,4,3,2,1]这种逐步填充的结果。
2. 输出和预期不符的核心问题
你的预期是生成从[5,4,3,2,1,0]开始,每次去掉第一个元素,直到只剩[0]的一系列列表,但当前代码的逻辑完全是反过来的:
- 你用的
range(5, 0, -1)只会生成5、4、3、2、1这五个数(因为range是左闭右开,不包含结束值0) - 代码逻辑是从空列表开始,一步步往里面加元素,每次加完就打印,所以得到的是列表从空到填满的过程
- 而你想要的是从包含5到0的完整列表出发,每次删掉头部元素,再打印每一步的结果
3. 实现预期效果的两种方法
方法一:从完整列表开始,逐步弹出头部元素
这种方法直接修改列表,每次打印后移除第一个元素,直到列表为空:
def fn(): # 先创建包含5到0的初始列表,range(5, -1, -1)会生成5、4、3、2、1、0 theList = list(range(5, -1, -1)) # 只要列表不为空,就打印并移除第一个元素 while theList: print(theList) theList.pop(0) fn()
执行这段代码,你就能得到完全符合预期的输出:
[5, 4, 3, 2, 1, 0] [4, 3, 2, 1, 0] [3, 2, 1, 0] [2, 1, 0] [1, 0] [0]
方法二:用切片生成每一步的列表
如果你不想修改原始列表,也可以通过切片直接生成每一步需要的子列表,更简洁:
def fn(): full_seq = list(range(5, -1, -1)) # 循环遍历索引,每次取从当前索引开始的切片 for i in range(len(full_seq)): print(full_seq[i:]) fn()
这个方法不会改动原始的完整序列,通过切片直接输出每一步的结果,和方法一的输出完全一致。
小补充
- 记住
range(a, b, step)的规则:序列包含起始值a,但不包含结束值b,所以要包含0的话,结束值得设为-1(因为步长是-1,递减到0就会停止) - 之前的输出不符合预期,除了range的参数问题,还有
print的位置不对——你把它放在了添加元素的循环内部,调整逻辑或者print的位置就能解决~
内容的提问来源于stack exchange,提问作者Bokchee 88
相关产品推荐
相关产品推荐

