スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
.-- -- スポンサー広告 comment(-) trackback(-)

Pythonメモ書き:リファレンスとコピー

ちょっと、まだ理解しきれていないのですが。。。。

Pythonでは、変数がオブジェクトの「コピー」ではなく「リファレンス」を保持するので、

同じオブジェクトに対応する「リファレンス」が1つのプログラム中に複数ある場合には注意が必要。

なぜかというと、

オブジェクトが可変性である場合、

あるリファレンスでの変更が、他のリファレンスにも影響を及ぼしてしまうからです。

では、どうしたらこの問題を回避できるか??

→同じオブジェクトへのリファレンスを複数作るのではなく、
 オブジェクト自体がコピーされるように指示します。


△ダメな例
>>>X = [1, 2, 3]
>>>L = ['a', X, 'b']
>>>D = {'x':X, 'y':2}

この時、リストXの要素を変更すると。。。
>>>X[1] = 'python'
>>>L
['a', [1, 'python', 3], 'b']
>>>D
{'x':[1, 'python', 3], 'y':2}
>>>
要素の変更が全てのリファレンスに影響されてしまう~(汗)


そこで、コピーを作成して、他の変数への影響をなくします。

☆コピー作成方法☆

○スライシングの式で、開始位置、終了位置を指定せず、空白にする(L[:])。これでシーケンスのコピーが作られる。

○ディクショナリのcopyメソッドを使用する(D.copy())。これでディクショナリのコピーが作られる。

○listなどのビルトイン関数を使用する(list(L))。

○標準ライブラリのcopyモジュールを使用する(ネストされたオブジェクトもコピーできる)。

>>>L = [1,2,3]
>>>D = {'a':1, 'b':2}
>>>
>>>A = L[:]      #A=Lでない点に注意!
>>>B = D.copy()    #B=Dでない点に注意!
>>>
>>>A[1] = 'python'   #要素の変更
>>>B['c'] = 'perl'   #要素の追加
>>>L, D
([1,2,3], {'a':1, 'b':2})          #要素の変更の影響なし
>>>A, B
([1,'python',3], {'a':1, 'b':2, 'c':'perl'}) #要素の変更が反映されている


また、次の例のようにスライシングの式によって、リストがコピーされれば、
リファレンスへの影響を防ぐことができる。
>>>X = [1, 2, 3]
>>>L = ['a', X[:], 'b']
>>>D = {'x':X[:], 'y':2}
>>>
>>>X[1] = 'python'
>>>L
['a', [1, 2, 3], 'b']
>>>D
{'x':[1, 2, 3], 'y':2}

となって、変数Xの要素の変更が他の変数に反映されない!!

スポンサーサイト
.01 2010 Python comment0 trackback0

comment

post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

trackback

trackbackURL:http://emiandkosuke.blog29.fc2.com/tb.php/27-4fc785a6

プロフィール

emi

Author:emi
日々、コンピューターとにらめっこしていた2010。
公の仕事に就くことを目指して教科書とにらめっこ2011,spring。
はたして2012は・・・

最新トラックバック

検索フォーム

ブロとも申請フォーム

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。