나는 csv 파일에서 라인을 읽고 조작 한 py 스크립트를 작성 중입니다. 지금까지 나는 변환 작업 목록을 CSV 있습니다.파이썬의 '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
고맙다 jleedev! [:]가 대답하고 내 질문을 해결하는 동안 copy.deepcopy 솔루션도 마찬가지입니다. 이는 얕은 복사본이 충분하지 않기 때문에 스크립트에서해야만하는 것입니다 (외관상으로는). 당신은 내 문제를 해결했습니다! :) – RaytheonLiszt
@Raytheon'[:]'슬라이스, 간단한'for' 루프, 그리고 얕은 복사는 모두 똑같은 효과를냅니다. –