Python 使用functools LRU缓存时是否删除非输入参数?
我有一个使用functools LRU缓存的函数,但我想传入一些非输入参数,例如“a” 发生什么事了?这也是使用functools嵌套的正确方法吗 更新 我在最后使用了它,即使用全局和不使用foo: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_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 []