2011-08-17 6 views
1

이 질문에 수천 번 전에 답변했지만 영어는 모국어가 아니므로 검색 할 때 정말 좋지 않으므로 실례합니다. 저는이 일을 위해 데이터베이스를 작성하여 파이썬을 배우려고하기 때문에이 문제를 만났습니다. 코드의 단순화 평화 :리스트의 의존성 문제 (파이썬)

x=[[0,0],[0,0]] 
    y=x[0:] 
    y[0][0]="1" 
    print x 

출력 :

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

내가 여기에 근본적인 뭔가가있어 이해하지만 왜 "X"가 "Y"와 함께 변경되었습니다? 모든 답변을 많이 주시면 감사하겠습니다.

답변

3

x[0:]을 사용하면 '딥 복사'가 생성되지 않습니다. 기본적으로 내부 배열 또는 'shallow copy'에 대한 참조를 복사하여 설정 y[0] 또는 y[1]x을 변경하지 않지만 내부 배열의 항목을 설정하면됩니다.

+0

FYI의'copy' 모듈에는 OP가 필요로하는 [deepcopy] (http://docs.python.org/library/copy.html#copy.deepcopy) 메소드가 있습니다. (또한'x [0 :]'는'x [:]'로 단축 될 수 있습니다.) –

+0

고마워요. 문제가 해결 되었어요. – HamsteR

2
y=x[0:] 

이것은 목록 x를 복사하지만 x의 요소는 배열이므로 참조로 복사됩니다. 필요한 것은 x의 각 요소를 복사하는 것입니다. 예 :

y = [val[:] for val in x] 

그런 다음 y를 변경해도 x에는 영향을주지 않습니다.

편집 : 그것은 deepcopy을 제안 것처럼

가지 경우 넓은 영역에 대한 작동 또 다른 대안입니다. 따라서 :

from copy import deepcopy 

y = deepcopy(x) 

중첩 된 목록 및 반복 할 수없는 요소에 대해 작동합니다.

+0

'deepcopy'가 더 좋았습니다. 왜냐하면 일부 항목은 구독 가능하지 않고 배열로 구성된 경우 실패하기 때문입니다. 2 단계 이상. –

+0

나는 deepcopy가 더 좋다고 동의하지만,이 접근법이 그의 접근이 효과가 없었던 이유를 설명하는 것이 더 나을 것이라고 생각합니다. 내 대답도 편집했습니다. – Bogdan

+0

감사합니다. 정수, 문자열 및 다른 형식이 같은 방식으로 작동하지 않는 이유가 궁금합니다. – HamsteR