2017-11-06 7 views
1

그래서, 나는이 이해 :슬라이스 할당, 얕은/깊은 사본

a_list = [1,2,3] 
b_list = [5,6,7] 
a_list.append(b_list) 

a_list는 현재 [1,2,3, [5,6,7]]

c_list = a_list[:] 
b_list[0] = 1000 
print(a_list, c_list) 

a_list c_list이 [1,2,3,[1000,6,7]]

입니다 [1,2,3,[1000,6,7]]

a_listc_listb_lista_list에 추가 된 경우 [5,6,7]을 나타내고, b_list으로 변경하면 a_listc_list으로 변경됩니다. 좋습니다.

문제

당신이있을 때입니다 :

a_list = [1, 2, [1,5,0]] 
b_list = a_list[:] 
a_list[2][1] = 90000 
print(a_list, b_list) 

a_list[1, 2, [1, 90000, 0]]하고 b_list[1, 2, [1, 90000, 0]]입니다.

b_list은 왜 변경 되었습니까? b_list은 참조가있는 경우 실제 개체가 아닌 참조를 복사하는 a_list의 단순 복사본입니다. 그러나 a_list에는 copy에 대한 언급이 없습니다. 정확한 값, 숫자 목록 및 b_list은 완전히 다른 값이므로 a_list의 일부 값이 변경된 경우 변경해서는 안되며 b_list은 할당을 통해 a_list을 가리키고 있지 않습니다.

+1

중첩 목록은 여전히 ​​* 참조입니다. 변수는 명명 된 참조이며 목록의 색인은 번호가 매겨진 참조입니다. –

+0

얕은 사본은 요소가 원래 목록의 요소와 동일한 새 목록입니다 (* 요소 사본 제외). 재귀 적으로 요소를 복사하려면'copy.deepcopy'를 사용하십시오. –

답변

0

파이썬에서 모든 내용을 참조하십시오. 리스트 인덱스는 이름 (변수)과 마찬가지로 참조 일뿐입니다.

따라서 a_list[2]은 목록 개체에 대한 참조입니다. a_list[0]은 정수 개체에 대한 참조와 같습니다. a_list의 간단한 복사본을 만들었습니다. 즉, 세 개의 참조가 모두 새 목록 개체로 복사되었습니다.

Ergo, b_list[2]은 다른 목록 개체 인 a_list[2]과 동일한 개체를 참조합니다. a_list[2] 또는 b_list[2]을 통해 해당 목록 개체를 수정하면 둘 중 하나를 통해 변경 내용이 표시됩니다.

참조 된 개체도 복사해야하는 경우 깊은 복사본을 만드십시오. copy.deepcopy()을 사용하여 모든 것을 반복적으로 복사하거나 목록 이해를 사용하여 직접 중첩 목록 만의 얕은 복사본을 만들 수 있습니다.