Chap.11 컬렉션 관리[컬렉션의 사본] - 리스트의 사본, is 연산자
컬렉션의 사본
리스트의 사본
리스트의 사본
-
시퀀스.copy() -> 시퀀스 복사본
listcopy1
list1 = [1, 2, 3]
list2 = list1 # 참조
print(list1 == list2)
list2[1] = 100
print(list1)
print(list2)
print(list1 == list2)
결과
True
[1, 100, 3]
[1, 100, 3]
True
Heap에 list2=list1이 참조될 뿐이다.
list2 = list1 대입에 의해 list2가 list1의 별명이 될 뿐 독립적인 메모리까지 확보하는 것은 아니다.
listcopy2
두 리스트를 완전히 독립적인 사본으로 만들기 copy 메서드
list1 = [1, 2, 3]
list2 = list1.copy() # list2 = list1[:]와 동일(slicing)
print(list1 == list2)
list2[1] = 100
print(list1)
print(list2)
print(list1 == list2)
결과
True
[1, 2, 3]
[1, 100, 3]
False
deepcopy1
list0 = ['a', 'b']
list1 = [list0, 1, 2]
list2 = list1.copy() # 얕은 복사
# list2 = [list0(참조), 1, 2] 이렇게 된것이다.
# list1 과 list2가 가르키는 메모리는 다름.
list2[0][1] = 'c'
list2[1] = -1
print(list1)
print(list2)
print(list0)
결과
[['a', 'c'], 1, 2]
[['a', 'c'], -1, 2]
['a', 'c']
deepcopy2
모듈의 메서드 (전의 메서드와 다르다.)
import copy
list0 = ['a', 'b']
list1 = [list0, 1, 2]
list2 = copy.deepcopy(list1) # 깊은 복사 (참조를 쫒아가서 그것까지 복사)
list2[0][1] = 'c'
print(list1)
print(list2)
결과
[['a', 'b'], 1, 2]
[['a', 'c'], 1, 2]
Heap 영역은 개발자가 조정할 수 있다.
예제
call by reference p253 그림 참고 ☆☆☆
def test(numbers):
numbers[0] = -1
print(numbers)
def main():
list1 = [1, 2, 3]
test(list1) # 참조가 복사된다. numbers = list1 과 같은 것이다.
print(list1)
main()
결과
[-1, 2, 3]
[-1, 2, 3]
예제
gabege(1) p253 그림 참고
def test2():
numbers = [1, 2, 3]
def main():
test2()
main()
garbage(2) p254 그림 참고
def test3():
numbers = [1, 2, 3]
return numbers
def main():
list3 = test3() # list3 = numbers 한 것과 같다.
print(list3)
main()
결과
[1, 2, 3]
c=f(a) 는 대입 연산이 2번 이루어진다.
참조는 stack에서 Heap으로만 이루어진다.
숫자와 bool만 값이 전달된다.
list1 = list2 (참조)
a=10 (값 전달)
b=a (참조)
숫자를 제외한 나머지는 다 참조로 운영이 된다.
완전히 분리된 사본을 만드려면 copy 메서드
이중으로 되어있는 사본을 만드려면 deepcopy
보통 함수 내에서 복사하고 사본을 리턴한다. (원본의 변경을 미연의 방지)
'인터페이스 개발 > Python' 카테고리의 다른 글
Python - 표준모듈[수학] - import, math, statistics (0) | 2020.07.26 |
---|---|
Python - 컬렉션 관리[예제] - 사전 활용[Value를 기준으로 정렬] (0) | 2020.07.26 |
Python - 컬렉션 관리[람다 함수] - filter, map, 람다 함수 (0) | 2020.07.26 |
Python - 컬렉션 관리[컬렉션 관리 함수] - enumerate, zip, any(), all(), 변수명 표기법 (0) | 2020.07.26 |
Python - 함수[인수의 형식] - 키워드 인수, 키워드 가변 인수 (0) | 2020.07.25 |
댓글