3

私は2つのファイルを持っています -

foo1.py -

a = 0;
b = {};
def f():
    global a;
    print "foo1: start a -",a;
    a = 10;
    print "foo1 changed a to :",a;
    global b;
    print "foo1: start b - ",b;
    b['me'] = 'fool';
    print "foo1 changed b to :",b;

foo2.py -

from foo1 import *
print "foo2 a before f:", a
print "foo2 b before f:", b
f();
print "foo2 a after f:",a
print "foo2 b after f:",b

python foo2.py を実行すると、次のように表示されます -

foo2 a before f: 0
foo2 b before f: {} <br/>
foo1: start a - 0
foo1 changed a to : 10
foo1: start b -  {}
foo1 changed b to : {'me': 'fool'}
foo2 a after f: 0 // **Doesn't change**
foo2 b after f: {'me': 'fool'} // **Changes**

誰かがこれを説明してもらえますか?

4

2 に答える 2

6

あなたはそう思いa = 10b['me'] = 'fool'同じようなことをしていますが、そうではありません。前者は名前aを新しい値にバインドします。後者は の値を変更しbます。ベアネームへの代入は決してオブジェクトを変更しません。名前を再バインドするだけです。

名前が新しいオブジェクトに再バインドfされるのはいつですか。ただし、 は古いオブジェクトを既にインポートしているため、これは には影響しません。がの場合、既に存在していた同じ辞書オブジェクトを変更します。はこの同じオブジェクトをインポートしたため、変更が表示されます。a = 10afoo2.pyfoo2pyfb["me"] = "fool"foo2.py

于 2012-08-06T09:02:08.820 に答える
4

aは不変であるため、インポートされた参照foo2は変更されませんが、名前はfoo1新しい値に再バインドされます。

b変更可能であるため、リバウンドすることはありません。どちらの名前も同じ参照を持っているため、同じオブジェクトを見ています。変更可能なオブジェクト (リスト、セットなど) でも同じことが起こります。

于 2012-08-06T08:54:09.373 に答える