Python 使用functools LRU缓存时是否删除非输入参数?

Python 使用functools LRU缓存时是否删除非输入参数?,python,Python,我有一个使用functools LRU缓存的函数,但我想传入一些非输入参数,例如“a” 发生什么事了?这也是使用functools嵌套的正确方法吗 更新 我在最后使用了它,即使用全局和不使用foo: @functools.lru_cache() def bar(d): global a random.seed(d) ... 它不会更改a,因为您正在函数中重新定义它。你基本上是这样做的: def foo(a): a = [1, 2, 3] return a

我有一个使用functools LRU缓存的函数,但我想传入一些非输入参数,例如“a”

发生什么事了?这也是使用functools嵌套的正确方法吗

更新

我在最后使用了它,即使用全局和不使用foo:

@functools.lru_cache()
def bar(d):
    global a
    random.seed(d)
    ...

它不会更改
a
,因为您正在函数中重新定义它。你基本上是这样做的:

def foo(a):
    a = [1, 2, 3]
    return a

a = []
foo(a)
因此,在函数调用之后,外部
a
将保持为空列表。您可能会说,但我使用的是
非本地
关键字,因此我应该引用原始的
a
。实际上,您正在引用该参数。因此,效果与上述代码相同。如果在有和没有
非本地
的情况下运行下面的代码,您可以看到发生了什么:

def foo(a):
    def bar():
        # nonlocal a
        a = [1, 2, 3]
        print("bar", a)
    bar()
    print("foo", a)

a = []
foo(a)
print("global", a)
产出:

bar [1, 2, 3]
foo []
global []
当您使用
非本地a
时:

bar [1, 2, 3]
foo [1, 2, 3]
global []

您可以在函数中执行的操作是删除
非本地a
语句,因为它对外部
a
没有任何影响,并将
a=[]
替换为
a.clear()

明白了,因此您必须小心不要重新初始化,因为这样会创建一个新列表。
bar [1, 2, 3]
foo []
global []
bar [1, 2, 3]
foo [1, 2, 3]
global []