ここはJupyterノートブックでの私の例です。Jupyterでの再帰
def list_flatenning(source_list, running_list=[]):
if [isinstance(x, list) for x in source_list]:
# There are list elements in our list, continue with recursion
for el in source_list:
if isinstance(el, list):
list_flatenning(el, running_list)
else:
running_list.append(el)
return source_list, running_list
else:
return source_list, running_list
これは、ネストされたリストを取り、平らなリストを返す再帰関数、である:一つのセルでは、私は次のコードを持っています。たとえば、この関数は[1,[2,3]]
を[1,2,3]
に変換します。今
、私は別のセルから一度この関数を呼び出す場合:
list_flatenning([1,[2,3]])[1]
私は戻って[1,2,3]
を取得します。同じセルをもう一度実行すると[1,2,3,1,2,3]
となり、もう一度実行すれば[1,2,3,1,2,3,1,2,3]
というようになります。
したがって明らかにrunning_list
関数からの変数は、すべての呼び出しで覚えて育ちます。
これと戦う1つの方法は、関数が定義されている同じセルから関数を呼び出すことです。このようなものであれば、常に一貫した結果が得られます。
def list_flatenning(source_list, running_list=[]):
if [isinstance(x, list) for x in source_list]:
# There are list elements in our list, continue with recursion
for el in source_list:
if isinstance(el, list):
list_flatenning(el, running_list)
else:
running_list.append(el)
return source_list, running_list
else:
return source_list, running_list
list_flatenning([1,[2,3]])[1]
もっと良い解決策があるのだろうかと思います。また、Jupyterで再帰関数を使って何が起こったのかを誰かが説明できるなら、私は大いに感謝しますか?
P.S.コードを試して、Jupyterがインストールされていない場合に備えて、ここにオンラインJupyterがあります。
[Pythonの変更可能なデフォルト引数の説明](https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument) –