Проблема в том, что вы всегда используете глобальную переменную.Использование изменяемой глобальной области видимости обычно является анти-паттерном.Сохранение вашего кода по существу одинаковым.Простым подходом является использование аккумулятора и передача его в качестве аргумента рекурсивным вызовам:
In [4]: def flatten(nested_list, result=None):
...: if result is None:
...: result = []
...: for i in nested_list:
...: if type(i) != list:
...: result.append(i)
...: else:
...: flatten(i, result)
...: return result
...:
...:
In [5]: x = [[1,[2], [3,4],5]]
In [6]: flatten(x)
Out[6]: [1, 2, 3, 4, 5]
In [7]: x
Out[7]: [[1, [2], [3, 4], 5]]
In [8]: flatten(x)
Out[8]: [1, 2, 3, 4, 5]
In [9]: x
Out[9]: [[1, [2], [3, 4], 5]]
Часто, однако, вы не хотите выставлять result
в качестве параметра, ожидающего стрельбысебя в ногу.Таким образом, вы можете определить «частную» вспомогательную функцию:
In [15]: def _flatten(nested_list, result):
...: for i in nested_list:
...: if type(i) != list:
...: result.append(i)
...: else:
...: _flatten(i, result)
...: return result
...:
...: def flatten(nested_list):
...: return _flatten(nested_list, [])
...:
...:
In [16]: x = [[1,[2], [3,4],5]]
In [17]: flatten(x)
Out[17]: [1, 2, 3, 4, 5]
In [18]: x
Out[18]: [[1, [2], [3, 4], 5]]
In [19]: flatten(x)
Out[19]: [1, 2, 3, 4, 5]
Или вы можете определить свой помощник внутри своей основной функции и сжимать переменную результата в замыкании:
In [26]: def flatten(nested_list):
...: result = []
...: def _flatten(nested_list):
...: for i in nested_list:
...: if type(i) != list:
...: result.append(i)
...: else:
...: _flatten(i)
...:
...: _flatten(nested_list)
...: return result
...:
...:
In [27]: flatten(x)
Out[27]: [1, 2, 3, 4, 5]
In [28]: x
Out[28]: [[1, [2], [3, 4], 5]]
In [29]: flatten(x)
Out[29]: [1, 2, 3, 4, 5]