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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:07:18