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

Python计算加性/乘性持久性时仅先调函数正常,第二个报变量未赋值错误

错误原因
  • Python中列表为可变对象,函数传参时传递的是引用地址。你在计算函数内部使用list.clear(nums)直接修改了原始传入的列表对象,第一个函数执行完成后,原始列表已经被修改为仅包含单个数字的列表,第二个函数执行时无法进入while循环,导致仅在循环内部定义的total/total2变量没有被赋值,打印时触发「变量在赋值前被引用」的报错。
  • total和total2仅在while循环内部定义,若用户输入的本身就是个位数,循环无需执行,同样会触发变量未定义错误。
  • 函数内冗余的for num in nums循环没有实际作用,还会导致逻辑执行次数和预期不符。
修复方案
  1. 计算函数内部先对传入的列表做拷贝,所有计算逻辑基于拷贝操作,避免修改原始列表
  2. 函数开头初始化结果变量,适配无需进入循环的单数字场景
  3. 删除冗余的for循环,简化执行逻辑
修复后完整代码
from functools import reduce
def get_numbers():
    num = int(input("Please enter an integer(negative integer to quit):"))
    nums = [int(a) for a in str(num)]
    return nums

def additive_calculator(nums):
    # 拷贝列表,不修改原始输入
    nums = nums.copy()
    print("Additive loop")
    counter = 0
    # 初始化结果变量,适配单数字场景
    total = sum(nums)
    while len(nums) > 1:
        total = sum(nums)
        nums = [int(a) for a in str(total)]
        print("sum:", total)
        print(len(nums))
        counter = counter + 1
    print("Additive persistence", counter,",", "Additive Root:", total)
print("DONE")

def multiplicative_calculator(nums):
    # 拷贝列表,不修改原始输入
    nums = nums.copy()
    print("multiplicative loop")
    counter = 0
    # 初始化结果变量,适配单数字场景
    total2 = reduce(lambda x, y: x*y, nums)
    while len(nums) > 1:
        total2 = reduce(lambda x, y: x*y, nums)
        nums = [int(a) for a in str(total2)]
        print("product:", total2)
        print(len(nums))
        counter = counter + 1
    print("multiplicative persistence", counter,",", "multiplicative Root:", total2)
print("DONE")


nums = get_numbers()
print(nums)
multiplicative_calculator(nums)
additive_calculator(nums)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:24:04