2017-06-30 12 views
0

ここは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があります。

+1

[Pythonの変更可能なデフォルト引数の説明](https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument) –

答えて

1

これはJupyterとは関係がありません。これは、Pythonがkwargsを使って行うことです。変更可能なオブジェクトをkwargのデフォルト値として使用しないでください。

変更し、それに:

def list_flatenning(source_list, running_list=None): 
    if running_list is None: 
     running_list = list()