2017-01-29 3 views
-3

Pythonでは、すべてがポインタで表されるべきです。リストのコピーに対する操作で元のリストの要素も変更されなかったのはなぜですか?

import copy 

a = ["a", "a"] 

copy = copy.copy(a) 
for (count, e) in enumerate(copy): 
    copy[count] += "b" 

print copy 
print a 

私は["ab", "ab"]が見込ま:私はリストcopyaに含まれるすべての元のポインタが含まれているだろうと思ったので、したがって、私は、同様に元のリストaを変更するには、次のコードを期待しました。驚くべきことに、aはまだ["a", "a"]しか含んでいないが、copyは実際に["ab", "ab"]を含んでいる。 copy = list(a)を使用しても動作しません。

この結果は、copy = copy.deepcopy(a)と書いた場合にのみ発生すると考えました。

どこが間違っていましたか?リスト内のすべての要素への参照を取得し、ミラーリストで変更する適切な方法は何ですか?それともPythonでは不可能なのでしょうか?

+0

文字列は不変ですか? – Zizouz212

+0

文字列は不変です。 – chepner

+0

@chepner 3秒遅れます:P – Zizouz212

答えて

1

あなたは混乱しています。 copy.copyを使用する目的は、古いものを参照しないで新しいリストを作成することです。参照を保持したい場合は、コピーしないでください:

a = ["a", "a"] 
copy = a 
+0

ありがとうございます。これは実際に私の質問に答える。この場合、 'copy'と' deepcopy'の違いは何でしょうか? –

+1

@ JIXiang Copyは新しいリストを作成しますが、そのリスト内のすべての要素は同じです。 Deepcopyはこれらの要素も再作成しようとします。 – Zizouz212

+1

@ JIXiang:リスト内の要素が変更可能でない限り、実際の違いはありません。この場合は変更できません。 – BrenBarn

関連する問題