我正在尝试构建一个使用闭包返回其先前调用的值的函数。第一次调用函数时,它将返回None。我不确定如何将last_in从一个呼叫更新为另一个呼叫。
def last_in(x):
last_in = [None]
def get():
temp = last_in[0]
last_in[0] = x
# print(last_in)
return temp
return get()
例如,print(last_in(1),last_in(2),last_in(3))
应打印:None 1 2
您的方法的问题在于,每当调用last_in
(即“外部”函数)时,存储在last_in
(数组而不是函数)中的先前值将重置为None
。相反,外部函数应仅被调用一次,以免每次调用时都不会重置该值。
[不确定您需要什么,但是我认为为此创建装饰器函数(即修改现有函数的函数)是有意义的。这样,所有的存储和检索最后结果都可以在装饰器中完成,而不会影响实际功能。外部函数(装饰器)仅被调用一次,原始函数被装饰后的版本替换,该版本将正确检索存储的值。
def return_previous(f):
f.last_result = None
def _f(*args, **kwargs):
res = f.last_result
f.last_result = f(*args, **kwargs)
return res
return _f
@return_previous
def some_function(x):
return x**2
print(some_function(1), some_function(2), some_function(3))
# None 1 4
我喜欢@tobias_k提供的解决方案,但这是符合您代码当前组织/结构的另一种选择。
def last_in(x):
def get():
temp = last_in.__dict__.get('prev', None)
last_in.__dict__['prev'] = x
return temp
return get()
print(last_in(1),last_in(2),last_in(3))
None 1 2
这与请求略有不同,因为它需要第二个关键字参数,但是您可以利用以下事实:默认参数仅设置一次(请参阅here),以进行如下操作:
def last_in(x, __last=[None]):
last = __last[0]
__last[0] = x
return last
[__last
在函数声明时设置一次,并且由于它是可变的,因此您可以在每次函数调用时对其进行更新,并且更新的值将在两次调用之间保留。