2017-11-12 4 views
0

私の問題は、私はリストを作成するときにということである「A」と、今私は数値的にソートする関数を呼び出すときリストがさえ

c=a[:] 

を使用して別のリストCでその内容をコピーし、それを修正することなく更新されます'a'、私はそれをソートしますが、 'c'の値を変更しても変換されます。 入力と出力の画像を参照してください! c = a[:]コピートップレベルのリストが、その中のアイテムは、同じサブリストへの参照であるため、事前に おかげ

enter image description here

+1

コードをコピーして質問に貼り付けてください。 –

答えて

2

はこれがあります。あなたはこの動作を回避したい場合は、深いコピーを行うことができます。

from copy import deepcopy 
c = deepcopy(a) 
0

奇妙に、それは変更しないでください。

>>> a=[1,4,5,7,22,41,4,-5,66,22,12] 
>>> c=a[:] 
>>> a.sort() 
>>> a 
[-5, 1, 4, 4, 5, 7, 12, 22, 22, 41, 66] 
>>> c 
[1, 4, 5, 7, 22, 41, 4, -5, 66, 22, 12] 

あなたにもc = list(a)でこれをやろうとすることができます。どちらの場合も、配列を値ではなく参照でコピーします。

これらの2つのメソッドには、内部オブジェクトが参照をそのまま維持するため、変更可能なオブジェクトのコレクションに制限があることがわかります。あなたは完全なコピーをしたい場合は、copy.deepcopyを使用して、このようにそれを使用できるように:

>>> from copy import deepcopy 
>>> a = [[1,2],[3],[4]] 
>>> c = deepcopy(a) 
0

問題は、この行は次のとおりです。d[i][j] = int(d[i][j])。 dはコピーされていないため、aが変更されます。リストの要素だけでなく、リストのみがコピーされているため、これを変更すると、cも変更されるため、両方のリストが変更されます。これを修正するには、他の回答の状態でdeepcopyと同じように、またはc = [element[:] for element in a]を使用します。

0

より包括的な答えがあります How to clone or copy a list?

で簡単な答えは:あなたは、リスト内のオブジェクトを持っている場合 - ...つまり、同様のオブジェクトをコピーし、あなたは深いコピーにリストが必要

0

問題は、この行で、実際にある:

d[i][j] = int(d[i][j]) 

これはあなたの入力(a)を変更しています。

これを修正するには、入力をコピーし、それを直接変更するために、あなたの関数を変更してみてください:

b = d[:] 
... 
b[i][j] = int(b[i][j]) 

は、その後、あなたがBを再割り当てする必要はありません。

関連する問題