2017-07-21 6 views
0

非常に単純なPythonです。古いリストをコピーして新しいリストオブジェクトを作成するだけです。 .copy()メソッドを使用することで、Pythonで公式の文書に基づいて新しいオブジェクトを作成する必要があると思いました。https://docs.python.org/3.6/library/stdtypes.html?highlight=list#list
新しいオブジェクトの要素を更新した後、古いリストオブジェクトの要素も変更されました。私は古い値を期待する出力がどのように来るlist.copy()の後に新しいオブジェクトを更新すると、古いオブジェクトも変更されるのはなぜですか?

old = [[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]] 

print(old) 
new = old.copy() 
for i in range(len(new)): 
    for j in range(len(new[0])): 
     new[i][j] = 0 
print(old) 
print(new) 

は、変更しないでください。

[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]] 
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] 
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] 
+0

'list.copy'はシャローコピーを行います。したがって、外側のリストにリストが含まれている場合、新しいリストは引き続き古い内側のリストを参照します。 'deepcopy'をインポートしたくない場合は、内部リストのコピーを作成するためにこれを行うことができます:' new = [u [old]にはu [:]] '。 –

答えて

5

コピーは一次元のリストで動作します。寸法を使用deepcopyの数に関係なく働くよりよい解決策について:

from copy import deepcopy 

old = [[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]] 

print(old) 
new = deepcopy(old) 
for i in range(len(new)): 
    for j in range(len(new[0])): 
     new[i][j] = 0 
print(old) 
print(new) 

そして、あなたが持っているでしょう:

[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]] 
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]] 
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] 

はそれが役に立てば幸い!

0

浅いコピーを(可能な限り)、新しい複合オブジェクトを作成し、

源から[copy.deepcopy][1]又は

from copy import deepcopy 
new = deepcopy(old) 

を試し、元に見つかったオブジェクトにその中に参照を挿入します。ディープコピーは新しい複合オブジェクトを構築し、再帰的に元のオブジェクトのコピーをそのオブジェクトに挿入します。

関連する問題