同様現象が再現できました。
runpy — Python モジュールの位置特定と実行によると
これはサンドボックスモジュール ではない ことに注意してください。すべてのコードは現在のプロセスで実行され、あらゆる副作用 (たとえば他のモジュールのキャッシュされたインポート等) は関数から戻った後にそのまま残ります。
さらに、 runpy 関数から戻った後で、実行されたコードによって定義された任意の関数およびクラスが正常に動作することは保証されません。
とあるので、呼出後にはモジュール内部の変数の値も変わらないと推測できます。
しかし一方
runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)(原文)
指定されたモジュールのコードを実行し、実行後のモジュールグローバル辞書を返します。モジュールのコードはまず標準インポート機構(詳細は PEP 302 を参照) を使ってモジュールの位置を特定され、まっさらなモジュール名前空間で実行されます。
と記載があるので、戻り値のグローバル辞書からbとcのまっさらな状態からの実行結果値を取得することはできそうです。ということで
Python
1import m, runpy # module -> m と記載
2for i in range(10):
3 ret = runpy.run_module('m')
4 print('m.b-m.c={},ret["b"]-ret["c"]={}'.format(m.b-m.c, ret["b"]-ret["c"]))
5"""
6m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=1002.1855023056205
7m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=953.6006614136874
8m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=785.3018135224241
9m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=780.7504193302373
10m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=997.0539166255655
11m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=798.4232457394988
12m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=938.8993618208882
13m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=1046.969906938842
14m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=1137.8183338647862
15m.b-m.c=992.8355988174958,ret["b"]-ret["c"]=830.4924045993087
16"""
にてret["b"]
、ret["c"]
は毎回異なる値となることが確認できました。