他の人が説明したように、リストを反復処理中にリストを変更することはできません。
リストのコピーを繰り返し処理しながらリストを変更することはできますが、新しいフィルタリングされたリストを生成する方がおそらく良いでしょう:
di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
di['children'] = [el for el in di['children'] if el not in di['children']]
なぜこれが良いのですか?これは、リストの変更を回避していることを意味します。これにより、コードの推論が容易になり、トレースが容易になり、通常は記述が容易になり、多くの場合、高速でスペース効率が向上します。反復中の変更の問題を心配する必要がないという事実は、「推論が容易」な部分の完璧な例です。
場合によっては、書くのが難しくなったり、遅くなったり、スペース効率が悪くなったりすることがあります。そのため、これは厳密なルールではなく単なるガイドラインです。しかし、答えが「いいえ」であることが判明したとしても、少なくとも「これをミューテーターではなく不変フィルターとして書き直すことはできますか」と考える価値は常にあります。
また、本当に、あなたのアルゴリズムはすべてを空にするのと同等であることが保証されていませんか? その場合:
di = {"a": 3, "children": [{"b": 5}, {"c": 6}]}
di['children'] = []