2009-06-04 13 views
10

私は次のコードスライスしてもリストのコピーが作成されない場合や、リストの実際のコピーを得るにはどうすればよいですか?

tempList=origList[0:10] 
for item in tempList: 
    item[-1].insert(0 , item[1]) 
    del item[1] 

を使用して私のリストのスライスを取った大きな私はへの変更のすべてのこの考え方をした私はリストを変更しようとしていますし、私の変更は少しトリッキーなっていたので私のリストリストはtempListオブジェクトに影響し、origListオブジェクトには影響しません。

私のコードを正しく取得して元のリストで実行したところ、上記のコードをテストする際に、最初の10個の項目(0〜9のインデックス)が影響を受けました。

だから、私はそれをgoogledと私はスライスを取ると、リストをコピーし、新しいものを作成すると言う参照を見つける。また、私はorigListを最初から作成したので、最初の10個のアイテムのIDを取得したので、アイテムのIDを見つけるのに役立つコードが見つかりました。リストを再びスライスし、スライスからのidがorigListの最初の10個のIDと一致していることがわかりました。

私はリストをコピーするために、より神託の方法を提案し、よりノートが

tempList=list(origList([0:10]) 

を使用することです、私はそれを試してみましたが、私はまだtempListからIDがorigListからのIDと一致していることを見つけました。

コーディング-Iは私がどのようにコピーがカイの答え正解に基づいて

を働くかを理解した後、自分でリストの内包でこれを行う方法を把握するつもりを行うには良い方法を提案しないでください方法は次のとおりです。魔法のよう

import copy 
tempList=copy.deepcopy(origList[0:10]) 
id(origList[0]) 
>>>>42980096 
id(tempList[0]) 
>>>>42714136 

作品

答えて

24

スライスは簡易コピーを作成します。あなたの例では、item [-1]に対してinsert()を呼び出していることがわかります。これはitemがリストのリストであることを意味します。つまり、浅いコピーは元のオブジェクトを参照します。実際のオブジェクトではなく、ポインタのコピーを作成すると考えることができます。

解決策は、代わりにディープコピーを使用することです。 Pythonはちょうどこのようなことのためにcopy moduleを提供します。浅いものと深いものの両方を検索したときの詳細な情報がたくさんあります。

+0

非常に参考になったGoogleは、すぐに浅いものから浅いものまでを考え出しました。ありがとうございます。 – PyNEwbie

4

オブジェクトをコピーすると、その内容はコピーされません。おそらくほとんどの場合、これはあなたが望むものです。あなたの場合は、内容が自分でコピーされていることを確認する必要があります。あなたはcopy.deepcopyを使うことができますが、もしあなたがリストのリストを持っているなら、私はcopy = [l[:] for l in list_of_lists]を使うことをお勧めします。

あなたcodestyleに少し注意:

  • デルは、文ではなく機能、それはそこに括弧を使用しない方が良いですので、彼らは混乱しているです。
  • 演算子の前後にあるカンマの後ろの空白は、コードを読みやすくします。
  • list(alist)はリストをコピーしますが、alist [:]よりもpythonicではありません。私はalist [:]が代わりに使用されていると思います。
+0

del-Iはそれを知らず、それを試した後、いくつかの関数(id)を試した後、文と関数の違いをどうやって伝えるかを考え出しました。私はdelを使っていくつかのコードを見つけ、括弧を使いました。あなたのコードは私に新しいIDを与えてくれました。私がしたときに私のリストを深くコピーしました:newl = [origList [0:10]のアイテムのためのtempList [:]]。しかし、copy.deepcopyは簡単ですね。私はそれがもっとpythonic henryであると言っていませんでした.precheur.orgはそう言っていました。しかし、私は何かを学んだ – PyNEwbie

関連する問題