You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python函数中已定义len_num却触发NameError,求问题排查方法

问题分析与解决

错误根源:缩进错误

你遇到的NameError完全是因为两个for循环没有缩进,跑到了函数is_armstrong_number的外部。len_num是函数内部定义的局部变量,函数外部的代码根本访问不到它,所以直接触发未定义错误。

你的代码还有其他问题,一起修正:

  • num_list没有初始化,直接调用insert会触发新的报错
  • int(num_list)是无效操作,不能直接把列表转成整数,需要逐个转换元素
  • 循环范围range(1, len_num)会跳过字符串的第一个字符(Python索引从0开始)
  • 阿姆斯特朗数的判断逻辑错误:应该是所有数字的len_num次幂之和等于原数,不是单个数字的幂等于原数

修正后的完整代码

def is_armstrong_number(num):
    # 转换为字符串获取位数
    num_str = str(num)
    len_num = len(num_str)
    # 初始化列表存储每个数字的整数形式
    num_list = []
    # 遍历字符串转成整数存入列表
    for x in range(len_num):
        num_list.append(int(num_str[x]))
    # 计算所有数字的len_num次幂之和
    total = sum(digit ** len_num for digit in num_list)
    # 判断并输出结果
    if total == num:
        print("It is an armstrong number")
    else:
        print("It is not an armstrong number")

# 测试示例
is_armstrong_number(153)  # 输出:It is an armstrong number
is_armstrong_number(123)  # 输出:It is not an armstrong number

更简洁的Pythonic写法

其实可以省略列表,直接遍历字符串计算:

def is_armstrong_number(num):
    num_str = str(num)
    len_num = len(num_str)
    total = sum(int(digit) ** len_num for digit in num_str)
    print("It is an armstrong number" if total == num else "It is not an armstrong number")

内容的提问来源于stack exchange,提问作者harrshaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:46:02