Я думаю, что лучше, если вы измените список, не передавая его в функцию без возврата. Это включает в себя python изменяемая переменная , ссылка и scope .
По сути, вы можете подумать, что список можно передать в функцию и изменить его значения внутри функции, но он должен оставаться неизменным вне функции. Однако это не то, как работает список python.
Например:
def temp(data):
data.clear()
data1 = [1,2,3]
temp(data1)
print(data1)
# output:
[]
Короткая версия состоит в том, что переменные python ссылаются по их идентификатору и передают список как есть (просто передавая имя, как показано в примере) в функции означает, что теперь список внутри функции и за ее пределами имеет один и тот же идентификатор, что означает, что изменение, выполненное внутри функции, повлияет на список вне функции. (такое же поведение при передаче списка в несколько разных функций, теперь каждая функция модифицирует этот список)
Кроме того, в зависимости от того, как вы изменяете список, иногда может быть сгенерирован новый идентификатор, который может испортить logi c еще больше.
Я думаю, что лучший способ - передать копию исходного списка (чтобы функция использовала список с тем же значением, но с другим идентификатором, то есть все изменения не будут отражаться в исходном списке), и имела функцию вернуть новый список. Затем назначьте новый возврат вашей переменной
ps. передача копии списка означает, что вы дублируете значение и занимает больше памяти, но это действительно не так важно, если у вас нет списка в 1 ГБ. Если это так, то передача его без .copy () и использование нового значения из функции return также работает.
def process_list(data):
# code provided by other answers
return data
inventory = process_list(inventory.copy())
Таким образом, более понятно, как изменяется значение