Python 3.6全局变量使用报错求助:运行自定义函数异常
问题排查与修复方案
嘿,我来帮你梳理这段代码里的问题,尤其是你提到的全局变量相关点,顺便把导致报错的核心逻辑问题也拆解清楚:
1. 先说说全局变量sec的问题
虽然你在Arrange函数开头声明了global sec,但其实这里完全没必要用全局变量——你的嵌套函数(Digit、IsEven这些)根本没用到sec,Arrange内部直接维护这个变量就够了。滥用全局变量反而会带来隐患,比如其他代码不小心修改sec的值,导致程序出现难以追踪的bug。不过这不是直接触发报错的原因,真正的问题在下面的逻辑里。
2. 直接导致报错/死循环的核心错误
你的代码有几个关键逻辑漏洞,这些才是让程序跑不起来的根源:
- 循环永远不会终止:在
while num>0循环里,你调用了WithoutTheLastDigit(num),但没有把返回值重新赋值给num!也就是说num永远是初始的500,循环会一直跑下去,最终要么耗尽内存,要么触发超时错误。正确的写法应该是num = WithoutTheLastDigit(num)。 AddDigit函数没有返回值:这个函数里你计算了number=number*10+dig,但没有用return把新值返回出去,所以它默认返回None。当你执行sec=sec+AddDigit(sec,Digit(num))时,就是在尝试把整数和None相加,这会直接抛出TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'的错误。- 冗余的函数调用:你在循环里单独写了
Digit(num),但没有把返回值存起来,其实可以直接在判断条件里调用这个函数,没必要单独执行一次。 - 错误的数值更新逻辑:你原来写的
sec=sec+AddDigit(sec,Digit(num))是错的——AddDigit(sec, dig)本身就是sec*10 + dig,再加上原来的sec会变成sec + sec*10 + dig,这显然和你“把偶数位数字按顺序拼接”的预期不符,应该直接用sec = AddDigit(sec, current_digit)。
修复后的完整代码
我把这些问题都修正了,同时去掉了不必要的全局变量,代码如下:
def Arrange(num): sec = 0 def Digit(nmb): return nmb % 10 def WithoutTheLastDigit(nmb2): return nmb2 // 10 def IsEven(even): return even % 2 == 0 # 简化成一行更简洁 def AddDigit(number, dig): return number * 10 + dig # 必须返回计算后的新数值 while num > 0: current_digit = Digit(num) if IsEven(current_digit): sec = AddDigit(sec, current_digit) num = WithoutTheLastDigit(num) # 必须更新num,否则死循环 print(sec) # 测试调用 Arrange(500) # 输出0,因为500的偶数位是0、0,拼接后是00,也就是整数0
关于全局变量的小建议
除非真的需要在多个函数之间共享状态,否则尽量不要用全局变量。如果嵌套函数需要修改外部函数的变量,可以用nonlocal关键字(针对嵌套函数场景),而不是直接用global。保持变量的作用域尽可能小,代码会更易读、更易维护。
内容的提问来源于stack exchange,提问作者Yair
相关产品推荐
相关产品推荐

