python:重置部分函数参数

时间:2017-08-28 20:35:15

标签: python

有没有办法重置python部分参数,而不必重新定义部分函数本身?

例如,我希望能够重置下面的累加器:

accum = []
def accumulator(list, item):
    list.append(item)

a = partial(accumulator, accum)
a(5)
a(7)
accum

按预期打印[5, 7]。现在我想将列表重置为空,但要在a上保持已定义的行为:

accum = []
a(8)
accum

我希望[8],但这一次,我得到一个空列表。有没有办法维护定义的函数和外部作用域中的变量之间的联系?

3 个答案:

答案 0 :(得分:6)

partial绑定对象,而不是变量; a引用了accum引用的列表对象,而不是对accum变量的引用。分配到accum只会重新绑定accum引用,而不是partial对象中的引用。

虽然您可以清除列表对象:

accum.clear()

或在Python 3.3之前:

del accum[:]

这个与partial绑定的可变对象的整个设置看起来像是一个奇怪的别名和有状态错误的秘诀。我建议采用不同的方法解决你想要解决的任何潜在问题。

答案 1 :(得分:1)

Python正在创建一个闭包,意味着partial返回一个函数a,该函数保存一个指向列表accum的指针,在内存中假设为0x1。

现在你在0x2创建一个新列表并替换变量accum中的指针。该函数仍在查看0x1。

您可以使用

accum.clear() 

将提供您想要的行为。

答案 2 :(得分:0)

就像其他人提到的那样,你采取的方法可能不是一个好主意。实现我想要的的一种方法是使用闭包:

def accumulator():
    acc = [] #each time you call accumulator, you have a new list
    def inner(item):
        acc.append(item) #that list is shared on each call of the returned inner
        return acc
    return inner

foo = accumulator()

print(foo(2))
print(foo(3))
print(foo(4))

bar = accumulator()
print(bar(9))