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

Python实现函数变量仅初始化一次、调用时保留更新值的方法

实现函数调用间保留变量状态的Python方案

嘿,这个需求太常见了——要让函数里的变量在多次调用后不重置,而是保留上次更新后的值对吧?我给你分享几个实用的Python实现方式,按需挑选就行:

1. 用函数属性(最简洁的方案)

直接把变量绑定到函数本身作为属性,因为函数在程序运行期间是持久存在的,所以属性值不会被重置:

def get_current():
    # 第一次调用时初始化变量为0
    if not hasattr(get_current, 'ctemp'):
        get_current.ctemp = 0
    get_current.ctemp += 1
    return get_current.ctemp

# 测试一下效果
print(get_current())  # 输出 1
print(get_current())  # 输出 2
print(get_current())  # 输出 3

原理很简单:第一次调用函数时,检查它有没有ctemp这个属性,没有就初始化为0;之后每次调用都会直接修改这个属性的值,自然能保留住上一次的状态。

2. 闭包(封装性更好)

如果你不想把变量暴露成函数的公开属性,用闭包来封装状态是个不错的选择:

def make_counter():
    # 外层函数的变量,会被内层函数捕获
    ctemp = 0
    def get_current():
        # 用nonlocal声明这个变量来自外层函数
        nonlocal ctemp
        ctemp += 1
        return ctemp
    return get_current

# 创建一个计数器实例
get_current = make_counter()

# 测试
print(get_current())  # 输出 1
print(get_current())  # 输出 2
print(get_current())  # 输出 3

这里make_counter返回的get_current函数会一直持有外层的ctemp变量,即使make_counter执行完了,这个变量也不会被销毁,每次调用get_current都会更新它的值。

3. 类实现(适合复杂场景)

如果之后需要给计数器加更多功能(比如重置、设置初始值),或者需要多个独立的计数器,用类来实现会更灵活:

class Counter:
    def __init__(self):
        # 初始化实例属性为0
        self.ctemp = 0

    def get_current(self):
        self.ctemp += 1
        return self.ctemp

# 创建一个计数器实例
counter = Counter()

# 测试
print(counter.get_current())  # 输出 1
print(counter.get_current())  # 输出 2
print(counter.get_current())  # 输出 3

类的实例属性ctemp会伴随实例的整个生命周期,每次调用get_current方法都会更新它。要是需要第二个独立的计数器,再创建一个Counter实例就行,两个实例的状态互不影响。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:08:38