2012-03-09 26 views
1

辞書マッピングに基づいて値を割り当てる:pythonで誰かが私にこれを説明することができれば、私は思っていた

In [400]: poz0='' 

In [401]: poz1='' 

In [402]: poz={0:poz0, 1:poz1} 

In [403]: for i in range(1): 
    .....:  poz[i]='some value '+str(i) 
    .....: 

In [404]: 

In [405]: poz[0] 
Out[405]: 'some value 0' 

In [406]: poz0 
Out[406]: '' 

を私はpoz0のために期待していたが、poz1ための[0]、同じPOZを==されるが、そのない。誰でも理由を説明できますか?

おかげ

+0

これを変更しようとすると... a = 1; b = a; a = 4; print b ...は結果1になります。したがって、poz [0] = poz0を代入すると、poz [0]の中にインスタンスではなく値が入ります。 "for"では、初期値を別の値で変更します。 – StefanNch

答えて

4

あなたが別のオブジェクト、'some value '+str(0)のすなわち値にpoz[0]を再割り当て:コメント答える

更新:リストは変更可能なオブジェクトであるため、リストで

は同じ動作ではありません。代入演算子=は、poz[0]の値を変更するのではなく、dictのバインディングを変更します。

+0

は意味があります。 – marlboro

+0

私はディエゴの答えが正しいと信じています... poz [0]はpoz0オブジェクトへの参照を含んでいません... poz0 = 100; poz = {0:poz0}; print poz; poz0 = 1000; print poz; ...変更なし – StefanNch

+0

@StefanNch:あなたの推論には欠陥があります。 'poz [0]'は 'poz [0] = poz0'の後に' poz0'の値への参照を含みますが、あなたの例では 'poz0'自体を再割り当てします。 –

2

strインスタンスが内蔵されているので不変オブジェクト(数値、文字列、タプル、frozenset型)の値が異なります。したがって、poz={0:poz0, 1:poz1}に辞書を作成すると、実際にはpoz={0:'', 1:''}と同じことをしています。

poz0はどのような方法でもpoz[0]とはリンクされていませんが、異なるオブジェクトがあります。

In [9]: l = [1,2,3] 

In [10]: d = {0: l} 
In [12]: d[0] 

Out[12]: [1, 2, 3] 

In [13]: d[0].append(4) 

In [14]: d[0] 
Out[14]: [1, 2, 3, 4] 

In [15]: l 
Out[15]: [1, 2, 3, 4] 
+2

これは本当ですが、これが動作の理由ではありません。リストでは、同様の動作が表示されます。 'd = {0:[1]}; d [0] = [2] '。 –

+0

変更可能なオブジェクトと同じではありません(更新された回答を参照) –

+1

さて、私はついにあなたをつかまえます。これは、割り当てのためです。 –

関連する問題