Как обеспечить видимость списочной переменной Python первой функции во второй без объявления глобальных переменных?

Рейтинг: 0Ответов: 2Опубликовано: 09.01.2023

Моя задача требует использовать в другой функции часть кода с рассчитанными переменными из первой функции. Я написал отвлеченный пример, когда переменные функции one() применяются в скрипте функции two().

Мне подсказали, что декоратор здесь не нужен. Но как тогда, не создавая во второй функции дубля по расчету переменной, скажем, list_one, использовать ее (и желательно по оригинальному названию из функции one())?

Пробовал разные варианты, и самый простой с глобальными переменными. Однако создавать их в перво функции не хотелось бы.

Вот код:

def one(order):
    list_one = [1,2,3,4]
    list_two = [5,6,7,8]
    k_el = 3
    setka = pd.DataFrame()
    setka['i'] = pd.Series(list_one)
    setka['j'] = pd.Series(list_two)
    return setka

def two(x):
    new_list = []
    for elem in list_one:
        if elem%2 == 0:
            new_list.append(elem+k_el) 
            
    setka_new = pd.DataFrame()
    setka_new['a'] = pd.Series(new_list)
    return setka_new

Ответы

▲ 3Принят

Вариантов можно много придумать. Например, возвращать всё что нужно из первой функции и передавать во вторую:

def one(order):
    list_one = [1,2,3,4]
    list_two = [5,6,7,8]
    ...
    return list_one, setka

def two(list_one, x):
    ...
    return setka_new

list_one, setka = one(order)
setka_new = two(list_one, x)

Другой вариант - формировать списки в ещё одной функции и вызывать её из этих двух функций. Но это подойдёт только если списки простые, а если они вычисляются сложно и тяжело, то лучше всё-таки первый вариант.

def get_lists():
    list_one = [1,2,3,4]
    list_two = [5,6,7,8]
    return list_one, list_two

def one(order):
    list_one, list_two = get_lists()
    ...
    return setka

def two(x):
    list_one, _ = get_lists()
    ...
    return setka_new

setka = one(order)
setka_new = two(x)

Но лучше всего, наверное, была бы комбинация первого и второго метода. Явная передача аргументов в функцию всегда лучше, чем неявная. И для тестирования и много ещё для чего:

def get_lists():
    list_one = [1,2,3,4]
    list_two = [5,6,7,8]
    return list_one, list_two

def one(list_one, list_two, order):
    ...
    return setka

def two(list_one, x):
    ...
    return setka_new

list_one, list_two = get_lists()
setka = one(list_one, list_two, order)
setka_new = two(list_one, x)
▲ 1

Если правильно понял вопрос :) Передать как аргумент функции, т.к. список ссылочный тип данных, изменение будут влиять на все его ссылки

def foo():
    l = []
    bar(l)
    print(l)


def bar(l: list):
    l.append(-1)