2017-08-30 3 views
0

インポートされたvarをファイル間で変更しようとしています。 FILE2値がまだ読み込んで、それを印刷する前に、FILE1でchange_stringを()の呼び出しにもかかわらずインポートされた変数の変更可能性

file1.py

string = 'data1' 

def change_string(): 
    global string 
    string = 'data2' 

#this does not update string in file2 
change_string() 

file2.py

from file1 import string 

#this prints initial value of string, regardless of change_string() function called in file1 
print string 

: 以下の例を参照してください 'DATA1を'。

私はここで何が欠けていますか?私は他の変数(dictsなどのコレクション)をimportステートメントで編集することができます。

change_string()の後にprint stringと呼んだ場合は、data2を印刷します。

私は何をしようとしていますか?文字列は不変オブジェクトである

+2

私はテストの後に "data2"を得ました。 – stamaimer

+1

Python 2または3 ??? – MaNKuR

+1

@MaNKuRはPython 2でなければなりません。Python 3では 'print string'は許可されていません。 –

答えて

1

シンプル、;)

あなたがあなたのfile1.pyさんグローバル・シンボル・テーブル値にもたらしているfrom file1 import stringを行うと、そのインポート変数の瞬間に(またはname)モジュール "file1.py"の "string"が/ mapping-toを参照していました。

これを行うと、 "file2.py"モジュールのシンボルテーブルのほかにまったく新しい名前が作成されますが、変更可能な値は変更できません。

global string 
string = 'data2' 

何がやっていることは(これにfile1.pyの名前は、マッピングされた-にで/指していた)オブジェクトのデータ1 'の値を変更していない:あなたは

新しいオブジェクトを作成し、file1.pyモジュールのシンボルテーブルの名前 "string"をこの新しいオブジェクト "data2"に再マッピングします。

EDIT:change_string()file1.pyモジュールのインポートを完了する前に実行されるので、あなたのコードは、実際にそうする前に、モジュールFILE2のシンボルテーブルに文字列シンボルを作成し、「DATA2」を返す

.py。私はあなたが指していると思われる問題を示すために、この例のコードを変更するだけです:インポート後にchange_string()を呼び出すと、データが変更されません。

file1.py

conf = {'string': 'data1'} 

def change_string(): 
    global conf 
    conf['string'] = 'data2' 

file2.py

from file1 import conf, change_string 

change_string() 
print conf['string'] 
+0

D'oh、それは私が見落としていたことが分かっていました。 私はこのように行動しますか?文字列をコンテナに入れますか? これは、私がやろうとしていることに対して過度のオーバーヘッドになるようです。 –

+0

はい、可変オブジェクトを使用する必要があります。 )単純なdictはそれほど悪くはないと思っています;) –

+1

@stamaimerそういうわけで、私が言ったのは、「file1.pyモジュールのインポートを終了する前にchange_string()が実行されるため、 –

-1

あなたが何かをインポートすると、あなたはそれをインポートし、現時点ではそのことのバージョンを取得します。 をインポートした後に加えられた変更はに引き継がれません。

唯一の解決策(変数をインポートするとき)は、変更が行われた後にその変数を再インポートすることです。

ただし、モジュールの変数ではなく、モジュール自体をインポートすることはできます。これにより、いつでも変数にアクセスできるようになります。変更が行われると、その変更が追跡されます。

+0

@stamaimer:はい。 'data2'を出力します。 –

関連する問題