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
相关产品推荐
相关产品推荐

