Python重置部分函数参数

2024-06-02 04:21:40 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以重设python部分参数,而不必重新定义分部函数本身?在

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

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

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

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

^{pr2}$

我希望[8]但是这次,我得到了一个空列表。有没有办法保持定义函数和外部范围内变量之间的联系?在


Tags: 方法函数列表参数定义defitempartial
3条回答

partial绑定对象,而不是变量;a引用了accum引用的列表对象,而不是{}变量的引用。赋值给accum只会重新绑定accum引用,而不是{}对象中的引用。在

清除列表对象时:

accum.clear()

或者在Python 3.3之前:

^{pr2}$

这个带有一个与partial绑定的可变对象的整个设置似乎是一个奇怪的别名和状态错误的配方。无论你想解决什么潜在的问题,我都会推荐一种不同的方法。在

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

现在,您将在0x2处创建一个新列表,并替换变量acum中的指针。函数仍在查找0x1。在

你可以用

accum.clear() 

这会给你想要的行为。在

就像其他人提到的,你采取的方法可能不是一个好主意。完成我认为你所追求的目标的一种方法是使用闭包:

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))

相关问题 更多 >