Удаление не входных параметров при использовании кеша LRU functools? - PullRequest
2 голосов
/ 29 мая 2020

У меня есть функция, которая использует кеш LRU functools, но я хочу передать некоторые не входные параметры, например «a»

import functools
import random

def foo(d, a):
    @functools.lru_cache()
    def bar(d):
        random.seed(d)
        nonlocal a
        a = []
        s = 0
        for i in range(100):
            r = random.random()
            a.append(r)
            s += r
        if s < 50:
            return True
        else:
            return False
    return bar(d)

Но когда я использую эти функции, «a» не изменяется :

a = []
print(foo(random.randint(0, 100), a))
print(a)

Что происходит? Также это правильный способ использовать вложенные functools?

Update

Я использовал это в конце, то есть с global и без foo:

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

1 Ответ

1 голос
/ 29 мая 2020

Не изменяется a, потому что вы переопределяете его в функции. Вы в основном делаете это:

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

a = []
foo(a)

Таким образом, внешний a останется пустым списком после вызова функции. Вы можете сказать, но я использую ключевое слово nonlocal, поэтому я должен ссылаться на исходный a. Фактически, вы имеете в виду параметр . Таким образом, эффект такой же, как и в приведенном выше коде. Если вы запустите приведенный ниже код с nonlocal и без него, вы увидите, что происходит:

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 []

И когда вы используете nonlocal a:

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

В своей функции вы можете сделать оператор delete nonlocal a, поскольку он не оказывает никакого влияния на внешний a и заменить a = [] на a.clear().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...