信用卡验证器(Luhn算法)报'int object is not subscriptable'错误求解
解决'int object is not subscriptable'错误 & 为什么要使用字符串处理信用卡号
嘿,我来帮你拆解这个问题!首先咱们先搞懂你遇到的错误到底是什么意思:
'int object is not subscriptable' 翻译过来就是“整数对象不支持下标操作”——简单说,你不能像操作字符串、列表那样,用[::-1]或者[3:]这种切片语法去处理一个整数。
为什么会出现这个错误?
看你代码里的这两行:
creditNums = int(input("Enter your credit card number mate: ")) reverseNums = creditNums[::-1]
你把输入的信用卡号转成了整数creditNums,但整数是单个数值,不是由多个元素组成的序列(比如字符串是字符序列,列表是元素序列)。当你尝试用creditNums[::-1]去“反转”它时,Python根本不知道你想做什么——因为整数没有“每一位”的概念,它只是一个抽象的数值。
为什么要用字符串处理?
信用卡号本质上是一串数字组成的序列,我们需要单独操作每一位数字(比如反转、取特定位置的数字、计算每一位的和)。字符串完美适配这个需求:
- 字符串是字符序列,每一位数字对应一个字符,你可以直接用下标/切片访问任意位置的字符;
- 处理完字符后,随时可以把单个字符转成整数进行数值计算,非常灵活。
如果坚持用整数处理,你得通过除法和取余来拆分每一位(比如1234 % 10取最后一位,1234 // 10去掉最后一位),这种写法不仅繁琐,还容易出错,远不如字符串直观。
修正你的代码示例
这里给你调整一下开头的部分,解决类型问题,同时贴合Luhn算法的逻辑:
def main(): # 先保留输入为字符串,方便按位操作 credit_card_str = input("Enter your credit card number mate: ") # 反转字符串(Luhn算法第一步) reversed_digits = credit_card_str[::-1] sum1 = 0 sum2 = 0 # 处理反转后奇数位置的数字(索引1,3,5...):乘以2,若结果大于9则拆成个位+十位 for i in range(1, len(reversed_digits), 2): num = int(reversed_digits[i]) doubled = num * 2 sum1 += doubled // 10 + doubled % 10 # 处理反转后偶数位置的数字(索引0,2,4...):直接求和 for i in range(0, len(reversed_digits), 2): sum2 += int(reversed_digits[i]) total = sum1 + sum2 if total % 10 == 0: print("Valid credit card number!") else: print("Invalid credit card number.") main()
总结一下
- 整数是单一数值,不支持下标/切片操作,所以你之前的代码会报错;
- 字符串是序列类型,能轻松访问每一位数字,是处理这类“数字序列”问题的最优选择;
- 后续计算时,把单个字符转成整数即可完成数值运算。
内容的提问来源于stack exchange,提问作者ClodeNoobs
相关产品推荐
相关产品推荐

