ここでこの返信に関連しています。地元の人のドキュメントはこちら。
ドキュメントには、辞書は変更されるべきではなく、それが何を意味するのかわからないがlocals()
、データが変更されないラボレポート、たとえば測定に適用できると記載されていますか?
ドキュメントに書かれていることは、ローカルx
変数がありlocals()['x'] = 42
、それを実行しx
ても、古いオブジェクトを指している可能性があるということです。
def foo():
x = 0xABCD
locals()['x'] = 42
print(x)
foo()
場合によっては、locals()を呼び出すと、ローカルスコープへのポインターではなく、複数のソースから収集された値が返されます。
例:関数呼び出し内で、locals()は、グローバルスコープと関数にローカルなスコープの組み合わせを返します。この場合、locals()出力を変更しても、基本的にアイランドを使用しているため、ローカルスコープは変更されません。それが機能する唯一のケースは、その出力がglobals()の出力と同じである場合のようです。
つまり、globals()を使用するか、同じ目標を達成するための別の方法を見つける必要があります。
CPythonインタープリターでは、ローカル変数はさまざまな場所から取得できます(これの詳細は重要ではありませんが、クロージャのために変数がどのように格納されるかに関係しています)。このlocals()
関数は、これらすべての場所から名前と値を収集して、それらすべてに1か所で簡単にアクセスできるようにしますが、特定の変数がどこから来たのかわからないため、元に戻すことはできません。言い換えれば、それは機能しないので悪い考えです。
localsは辞書を返す関数であり、ここではその辞書に値を設定しています。これによりローカル変数xの値が2に変わると思うかもしれませんが、そうではありません。localsは、実際にはローカルネームスペースを返しませんが、コピーを返します。したがって、これを変更しても、ローカル名前空間の変数の値には何の影響もありません。
ドキュメント(リンク先)には次のことを明示的に指示していないため、変更はお勧めできません。
注:この辞書の内容は変更しないでください。変更は、インタプリタによって使用されるローカル変数と自由変数の値に影響を与えない場合があります。
それ以上の理由は必要ありません。
変数を変更しない方法で使用している場合は問題ありませんが、設計に疑問を投げかけ、必要なことを行うためのより良い方法があるかどうかを確認します。
リンクする特定の例では、モジュールのグローバルスコープで使用するため、localsは実際にはglobals()です。この非常に特殊な使用法は現在機能しており、グローバルと同じように機能し続けると思いますが、代わりにグローバルを使用することもできます。
さらにクリーンな解決策は、おそらく、設計の残りの部分を知らなくても、変数に通常のol'辞書を使用することです。次に、globals()["x"]=valueの代わりにdata["x"]=valueを使用します。