Jeśli celem funkcji jest zmodyfikowanie parametru przekazanego jako working_list, zobacz odpowiedź HenryR (= None, sprawdź brak wewnątrz).
Ale jeśli nie zamierzałeś modyfikować argumentu, po prostu użyj go jako punktu wyjścia dla listy, możesz go po prostu skopiować:
def myFunc(starting_list = []):
starting_list = list(starting_list)
starting_list.append("a")
print starting_list
(lub w tym prostym przypadku tylko, print starting_list + ["a"]ale myślę, że to był tylko przykład zabawki)
Ogólnie rzecz biorąc, mutowanie argumentów to zły styl w Pythonie. Jedynymi funkcjami, od których w pełni oczekuje się, że będą mutować obiekt, są metody obiektu. Jeszcze rzadziej mutuje się opcjonalny argument - czy efekt uboczny, który występuje tylko w niektórych wywołaniach, jest naprawdę najlepszym interfejsem?
Jeśli robisz to z nawyku „argumentów wyjściowych” w języku C, jest to całkowicie niepotrzebne - zawsze możesz zwrócić wiele wartości jako krotkę.
Jeśli robisz to, aby efektywnie budować długą listę wyników bez tworzenia list pośrednich, rozważ napisanie jej jako generatora i używanie go result_list.extend(myFunc())podczas wywoływania. W ten sposób konwencje powołania pozostają bardzo czyste.
Jednym ze wzorców, w którym często przeprowadza się mutację opcjonalnego argumentu, jest ukryty argument typu „memo” w funkcjach rekurencyjnych:
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)