Если функция предназначена для изменения параметра, переданного как working_list
, см. Ответ HenryR (= Нет, проверьте наличие Нет внутри).
Но если вы не намеревались изменить аргумент, просто используйте его в качестве отправной точки для списка, вы можете просто скопировать его:
def myFunc(starting_list = []):
starting_list = list(starting_list)
starting_list.append("a")
print starting_list
(или в этом простом случае просто print starting_list + ["a"]
, но я думаю, это был просто игрушечный пример)
В общем, изменение ваших аргументов - плохой стиль в Python. Единственные функции, которые, как ожидается, будут мутировать объект, - это методы объекта. Еще реже мутировать необязательный аргумент - действительно ли побочный эффект, который происходит только при некоторых вызовах, действительно лучший интерфейс?
Если вы делаете это из привычки C к «выходным аргументам», это совершенно не нужно - вы всегда можете вернуть несколько значений в виде кортежа.
Если вы делаете это для эффективного построения длинного списка результатов без создания промежуточных списков, попробуйте написать его как генератор и использовать result_list.extend(myFunc())
при вызове. Таким образом, ваши соглашения о вызовах остаются очень чистыми.
Один шаблон, в котором часто делается мутирование необязательного аргумента , представляет собой скрытый аргумент "memo" в рекурсивных функциях:
def depth_first_walk_graph(graph, node, _visited=None):
if _visited is None:
_visited = set() # create memo once in top-level call
if node in _visited:
return
_visited.add(node)
for neighbour in graph[node]:
depth_first_walk_graph(graph, neighbour, _visited)