Python实现字符串除末尾4位替换为#报IndexError如何解决
错误原因
- 核心触发点是代码中使用了固定长度的全局字符串
c做索引取值:全局定义的c = "3656013700"长度固定为10,当maskify函数的入参cc长度超过10时,循环到i>=10时访问c[i]就会超出c的索引范围,抛出越界错误。 - 额外的逻辑错误:
- 全局变量
a是根据初始化时的cc(长度10)计算得到的固定值5,当函数入参cc长度变化时,这个判断阈值完全不匹配。 - 用
while做长度<=4的判断属于逻辑误用,仅需要单次条件判断,不需要循环逻辑。 - 函数内部取值应该用入参
cc,而非全局定义的c,二者内容可能完全不一致。
- 全局变量
修复方案
优化后的可运行代码
def maskify(cc): # 长度小于等于4直接返回原字符串 if len(cc) <= 4: return cc # 前半段替换为#,保留最后4位 return '#' * (len(cc) - 4) + cc[-4:] # 测试用例 print(maskify("3656013700")) # 输出:######3700 print(maskify("1234")) # 输出:1234 print(maskify("123456789")) # 输出:#####6789
改动说明
- 移除了所有冗余的全局变量,所有逻辑在函数内部完成,避免全局值污染导致的逻辑错误。
- 替换错误的
while循环为if条件判断,符合业务需求。 - 简化了替换逻辑,不需要逐位遍历赋值,直接通过字符串切片和乘法即可完成需求,性能和可读性都更高。
- 完全基于入参
cc做计算,不再依赖全局固定值,适配任意长度的输入字符串。
内容的提问来源于stack exchange,提问作者Juan Felipe Gama
相关产品推荐
相关产品推荐

