私はcsvファイルから行を読み込み、それらを操作して戻すpyスクリプトに取り組んでいます。これまでのところ、変換作業をリストするcsvがあります。なぜPythonの 'for'ループが参照されていないリストを変更するのですか?
私が抱えている問題は、一時的なリストを繰り返したときに、forループがすべての一時的なリストを変更するというものです。ここに、私が何を言おうとしているのかの簡単な例があります。
>>> l = [['hi', 'ho'],['no', 'go']]
>>> t = []
>>> y = []
>>>
>>> for row in l:
... row[0] = '123'
... y.append(row)
... t.append(row)
...
>>> y
[['123', 'ho'], ['123', 'go']]
>>> t
[['123', 'ho'], ['123', 'go']]
したがって、上記は簡単です(うまくいけば)。 (私はリストをコピーするだけでなく、他のことをしたいと思っています。単純にしておきたい)。
しかし、ここには私が手に入れない部分があります。
>>> z = []
>>> for row in y:
... row[0] = 'xxxx'
... z.append(row)
...
>>> z
[['xxxx', 'ho'], ['xxxx', 'go']]
>>> t
[['xxxx', 'ho'], ['xxxx', 'go']]
>>> y
[['xxxx', 'ho'], ['xxxx', 'go']]
私はサブリストの最初の部分を変更して、新しいリスト「Z」にそれを保存したい場合は、それは同様リストtを変更します!
ここでは何が起こっていますか? z、y、tは同じメモリ位置を指していますか?ここで何が起こっても
、?:
上記の質問に似て>>> for rowx in y:
... rowx[0] = 'x55x'
... z.append(rowx)
...
>>> z
[['xxxx', 'ho'], ['x55x', 'go'], ['x55x', 'go'], ['x55x', 'go']]
>>> t
[['xxxx', 'ho'], ['x55x', 'go']]
>>> y
[['xxxx', 'ho'], ['x55x', 'go']]
は、なぜyは、tが変わっ取得しますか?
ありがとうございます!
リストの浅いコピーについては、 'y [:]'を使用することができます – SingleNegationElimination
ありがとうございました! [:]が答えて私の質問を解決している間、あなたのcopy.deepcopy解決策もそうです、それは浅いコピーが十分ではない(明らかに)ので私のスクリプトでやらなければならなかったものです。あなたは私の問題を解決しました! :) – RaytheonLiszt
@Raytheon '[:]'スライス、単純な 'for'ループ、そして浅いコピーはまったく同じ効果を持っています。 –