11

コード

値の変更を他のモジュールに「伝播」させて、他のモジュールでグローバル変数を使用したいと思います。

a.py:

x="fail"
def changeX():
    global x
    x="ok"

b.py:

from a import x, changeX
changeX()
print x

b.py を実行すると、"ok" と出力されますが、実際には "fail" と出力されます。

質問

  1. 何故ですか?
  2. 代わりに「OK」と出力するにはどうすればよいですか?

(python-2.7を実行中)

4

3 に答える 3

15

要するに、コードを変更せずに「OK」と出力することはできません。

from a import x, changeX次と同等です。

import a
x = a.x
changeX = a.changeX

つまり、はを間接的にfrom a import x作成するのではなく、モジュール内に の現在の値を持つ新しいグローバル変数を作成します。このことから、後で を変更しても に影響しないことがわかります。xa.xxba.xa.xb.x

コードを意図したとおりに機能させるには、コードを次のように変更するだけb.pyですimport a

import a
a.changeX()
print a.x

乱雑なインポートが少なくなり、コードが読みやすくなり (インポートのリストを見なくても、どの識別子がどこから来ているかが明確になるため)、循環インポートの問題が少なくなり (すべての識別子が一度に必要になるわけではないため)、ツールreloadは働くのが好きです。

于 2012-11-15T17:59:02.427 に答える
3

の後に別の import ステートメントを追加することもできますchangeX。これにより、コードが b.py から次のようになります。

from a import x, changeX
changeX()
from a import x
print x

これは、 を呼び出すことによって、モジュール内changeXのみが変更されることを示しています。再度インポートすると、更新された値が identifier に再度バインドされます。xax

于 2013-07-23T17:26:30.037 に答える
2

また、リストなどの変更可能なコンテナを使用することもできます。

a.py

x = ['fail']

def changeX():
    x[0] = 'ok'

b.py

from a import changeX, x

changeX()
print x[0]
于 2012-11-15T18:17:23.253 に答える