Если целью функции является изменение параметра, переданного как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)