質問: num: li.append(data[i]) for i in range(len(li)): del li[i][0] return li ``` 何度も回すうちにreturnで得られる結果が、 カラのリストになっていってしまって困っています。 ### 追記 . どんなふうに関数Aを呼び出したか ``` In[1]: A(a,1) In[2]: A(a,1) ``` ・どんな実行結果になったか 一回目は、想定していた結果が得られたのですが、 二回目以降は、一回目と同じ結果が得られません。 ``` Out[1]: [[2, 3], [3, 5], [4,9]] Out[2]: [] ``` ・どのような結果を期待していたか 何回繰り返しても同じ結果が得られることが望ましいです。 ``` Out[1]: [[2, 3], [3, 5], [4,9]] Out[2]: [[2, 3], [3, 5], [4,9]] ``` ・どんな原因があると現時点で推測しているか 「del」の使い方や仕様がわかっていないのですが、 二回目以降の処理にかかわっているのだと思います。
回答: > > 何回繰り返しても同じ結果が得られることが望ましいです。 > > > なるほど。 関数Aを一回呼び出した後、試しにprint(a)してみて下さい。 関数内の操作がもろに影響していることが観察できる筈です。 引数dataを直接操作しないで下さい。呼び出し元に操作が波及します。 解消するための方針は、主に二つあります。 1. 引数dataをコピーして、それを編集する方法 2. 要素を消していくのでは無く、残したい要素を選んでいく方法 現状のコードを活かしたいなら、前者の方法が便利です。 ``` def A(data, num): ret = [row[:] for row in data] # dataをコピー ... ... retを操作していく ... return ret ``` **修正: シャローコピーでは対応できないことに後で気付いた。** より理解を深めるため、後者の方法もトライしてみることをお勧めします。