Как обеспечить видимость списочной переменной Python первой функции во второй без объявления глобальных переменных?
Моя задача требует использовать в другой функции часть кода с рассчитанными переменными из первой функции. Я написал отвлеченный пример, когда переменные функции 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
Ответы (2 шт):
Если правильно понял вопрос :) Передать как аргумент функции, т.к. список ссылочный тип данных, изменение будут влиять на все его ссылки
def foo():
l = []
bar(l)
print(l)
def bar(l: list):
l.append(-1)
Вариантов можно много придумать. Например, возвращать всё что нужно из первой функции и передавать во вторую:
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)