Python两类enumerate替换列表None方案等价性及y[:-1]作用咨询
问题解答
1. 两套代码运行结果等价的原因
我们可以直接拆解两个函数的执行逻辑对比:
- 第一套代码的循环用
enumerate(x)遍历,下标i的取值范围是0 ~ 11(对应长度为12的输入列表):- 当
i=0时,x[0]为None,会执行x[0] = x[-1],但原列表末尾元素本身就是None,所以这一步赋值没有实际效果,x[0]还是None - 当
i=1时,x[1]为None,赋值为x[0]也就是None,同样没有实际效果 i≥2之后的逻辑就是遇到None就用前一位元素赋值,和第二套代码完全一致
- 当
- 第二套代码的循环用
enumerate(y[:-1], 1)遍历,下标i的取值范围是1 ~ 11,刚好跳过了i=0的情况,i≥1之后的赋值逻辑和第一套代码完全一致
因为第一套代码里唯一和第二套逻辑有差异的i=0步骤没有产生实际修改,所以两套代码运行结果完全等价。
2. 第二套代码使用y[:-1]的设计逻辑
这个写法是为了更严谨地匹配业务需求:
业务要求是把None替换为前一个位置的元素,从逻辑上来说下标为0的元素不存在合法的「前一个位置」(如果用Python负索引取末尾元素其实不符合需求本意),所以作者直接跳过了i=0的遍历:
y[:-1]是去掉最后一个元素的子列表,长度为11,配合enumerate的第二个参数start=1,刚好生成1 ~ 11的下标,覆盖了所有需要处理的位置(从第二个元素到末尾元素)- 这个写法从根源上避免了访问
i=0的前一位元素(也就是负索引的末尾元素)的不合理操作,就算输入列表的开头是None、末尾是有效值,也不会出现把末尾值错误填充到开头的bug,比第一套写法鲁棒性更强。
内容的提问来源于stack exchange,提问作者Calbruin
相关产品推荐
相关产品推荐

