Python不同函数变量修改是否互不影响?快乐数代码无输出咨询
不同函数内的同名变量是否会互相影响
Python 的函数拥有独立的局部命名空间,除非显式声明全局变量、使用嵌套闭包引用,或是操作可变对象的内存地址,不同函数里定义的同名局部变量完全隔离,不会出现修改变量后跨函数生效的情况。
对应你写的代码:
happy函数里的形参num、变量finding,都是happy自己的局部变量,只在happy的执行过程中存在hfind函数里的形参num、变量total,都是hfind自己的局部变量,你在hfind内部写num = total,只是修改hfind内部这个num的指向,完全不会改动happy函数里的num值,两者只是名字相同,本质是互不干扰的独立变量。
运行
happy(100) 无输出的原因 你的代码没有输出,核心是死循环卡住了执行流程,根本走不到后面的 if 判断打印语句,具体拆解问题点:
- 循环逻辑断层
你在happy的while循环里,把hfind(num)的返回值赋值给了finding,但从来没有把这个新的数值回传给循环判断用的num变量。
跑happy(100)时的实际执行流是:- 初始
num = 100,字符串长度为3,满足len(str(num)) > 1的循环条件 - 进入循环调用
hfind(100),计算得到返回值2,赋值给finding - 循环体执行完,回头判断循环条件时,还是拿初始的
num=100算长度,永远满足大于1的条件,程序就卡在无限循环里,根本碰不到后面的打印语句。
- 初始
- 快乐数计算逻辑错误
快乐数的定义是「重复计算每一位数字的平方和,直到结果为1」,你在hfind里写的是total += int(i) * 2,也就是把每一位数字乘2累加,完全不符合平方和的计算规则,哪怕跳出死循环,判断结果也是错的。 - 边界情况遗漏
如果最开始传入的num本身就是个位数(比如1、7),while循环根本不会执行,此时finding变量从来没有被定义,走到后面判断if finding == 1的逻辑时,会直接触发NameError。
修正后的可运行代码
def happy(num): # 记录出现过的数值,避免非快乐数进入固定循环导致死循环 seen = set() while num != 1 and num not in seen: seen.add(num) # 把每次计算得到的新值赋值回num,让循环基于最新值判断 num = hfind(num) return num == 1 def hfind(num): total = 0 for i in str(num): # 修正计算逻辑:累加每一位数字的平方 total += int(i) ** 2 return total # 调用测试 print(happy(100))
测试 happy(100) 时,计算流程为 100 → 1² + 0² + 0² =1,最终会正确输出 True。
内容的提问来源于stack exchange,提问作者NAIDU
相关产品推荐
相关产品推荐

