gui_texts
a を gui_texts に設定してから変更することで、それ自体に再帰的に追加しています。
>>> gui_texts = {}
>>> gui_texts
{}
>>> import json
>>> gui_texts['entireText'] = json.dumps(gui_texts)
>>> gui_texts
{'entireText': '{}'}
>>> gui_texts['entireText'] = json.dumps(gui_texts)
>>> gui_texts
{'entireText': '{"entireText": "{}"}'}
を作成する場合は、それ自体にa = gui_texts
追加しないでください。gui_texts
json ダンプの前に wholeText を {} に設定すると、再帰が中断されますが、それでも回避する必要があります。gui_texts をそれ自体に追加すると、以前のシリアライゼーションではなく、空の dict に wholeText がリセットされたため、テキストが大きくなりません。
>>> gui_texts = {}
>>> gui_texts['entireText'] = {}
>>> gui_texts
{'entireText': {}}
>>> gui_texts['entireText'] = json.dumps(gui_texts)
>>> gui_texts
{'entireText': '{"entireText": {}}'}
>>> gui_texts['entireText'] = {}
>>> gui_texts
{'entireText': {}}
>>> gui_texts['entireText'] = json.dumps(gui_texts)
>>> gui_texts
{'entireText': '{"entireText": {}}'}
a = gui_texts.copy()
gui_texts がコードから来て、それを表示する前に変更したい場合のように、おそらく gui_texts のコピーを作成したいと思うでしょう。
モジュール変数はすべてのスレッド間で共有され、スレッドローカルのみがスレッドに対してローカルです。ページリクエストごとにすべてのインポートなどで新しいインタープリターを開始することはありません。これらを変更する機能は非常に強力ですが、何が起こっているのかを完全に理解していないと、時々困ることがあります。