Якщо метою функції є зміна параметра, переданого якworking_list , дивіться відповідь HenryR (= None, перевірте наявність None всередині).
Але якщо ви не мали наміру мутувати аргумент, просто використовуйте його як вихідну точку списку, ви можете просто скопіювати його:
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())коли ви його викликаєте. Таким чином ваші умовні умови залишаються дуже чистими.
Один шаблон, де часто робиться мутація необов'язкового аргументу, це прихований аргумент "пам'ятка" в рекурсивних функціях:
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)