1. ホーム
  2. python

[解決済み] モジュール変数を他のモジュールから変更するには?

2022-07-07 19:16:05

質問

という名前のパッケージがあるとします。 bar という名前のパッケージがあり、そのパッケージには bar.py :

a = None

def foobar():
    print a

__init__.py :

from bar import a, foobar

そして、このスクリプトを実行します。

import bar

print bar.a
bar.a = 1
print bar.a
bar.foobar()

以下は期待するところです。

None
1
1

こんな感じです。

None
1
None

どなたか私の誤解を説明してください。

どのように解決するのですか?

あなたが使用している from bar import a . a はインポートするモジュールのグローバルスコープ(またはimport文が発生する任意のスコープ)のシンボルになります。

に新しい値を代入すると a に新しい値を代入すると、どの値 a が指す値を変えているだけで、実際の値ではありません。試しに bar.py で直接 import bar__init__.py を設定し、そこで実験を行います。 bar.a = 1 . この方法では、実際に変更するのは bar.__dict__['a'] の「本当の」値である a の本当の値です。

3層で少し複雑ですが bar.a = 1 の値を変更します。 a というモジュールで bar というモジュールで、実際には __init__.py . の値を変更することはありません。 a その foobar が見えるのは foobar は実際のファイル bar.py . を設定することができます。 bar.bar.a を設定することができます。

を使うことの危険性の一つです。 from foo import bar の形式は import ステートメントを分割します。 bar の中からグローバルに見える2つのシンボルに分割します。 foo の中でグローバルに見えるシンボルで、最初は元の値を指します。 import ステートメントが実行されるスコープで見える別のシンボルを指しています。シンボルが指す場所を変更しても、それが指している値は変わりません。

このようなことは reload を試みるとき、この種のものは殺人的です。