Python计算加性/乘性持久性时仅先调函数正常,第二个报变量未赋值错误
错误原因
- Python中列表为可变对象,函数传参时传递的是引用地址。你在计算函数内部使用
list.clear(nums)直接修改了原始传入的列表对象,第一个函数执行完成后,原始列表已经被修改为仅包含单个数字的列表,第二个函数执行时无法进入while循环,导致仅在循环内部定义的total/total2变量没有被赋值,打印时触发「变量在赋值前被引用」的报错。 total和total2仅在while循环内部定义,若用户输入的本身就是个位数,循环无需执行,同样会触发变量未定义错误。- 函数内冗余的
for num in nums循环没有实际作用,还会导致逻辑执行次数和预期不符。
修复方案
- 计算函数内部先对传入的列表做拷贝,所有计算逻辑基于拷贝操作,避免修改原始列表
- 函数开头初始化结果变量,适配无需进入循环的单数字场景
- 删除冗余的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
相关产品推荐
相关产品推荐

