본문 바로가기
IT/파이썬

파이썬 변수 할당시 메모리 복사? 참조? copy deepcopy slicing

항상 궁금하던 건데, 파이썬은 막쓰기 좋은데 불안해~~~

 

일단 변수에 다른 변수를 대입하는 형태로 하면 기본적으로는 포인터 교환처럼 같은 곳을 가리키는 포인터 값을 공유하는 느낌.

 

from docs.python.org/ko/3/library/copy.html

파이썬에서 대입문은 객체를 복사하지 않고, 대상과 객체 사이에 바인딩을 만듭니다.가변(mutable) 컬렉션 또는 가변(mutable) 항목들을 포함한 컬렉션의 경우때로 컬렉션을 변경하지 않고 사본을 변경하기 위해 복사가 필요합니다.

 

요상하게 2가지 타입이 있어서 동작이 다르게 된다고 하니 그게 좀 문제

mutable , immutable 

 

대충 내가 이해하기 위해 적어논 원칙,

mutable 은 그냥 복사한 대로 그대로 사용만 되고, (즉 문자열같은 경우 문자열 내에 일부 문자열을 바꿀 수 없다는 뜻) 단, 재할당은 새로운 곳에 다시 만들게 되므로 가능

immutable 은 복사한 놈이든 원본놈이든 같이 바꿀 수 있다. 이 경우에도 재할당을 하면 새로운 개체가 만들어지니 별도로 움직이게 된다.

 

자세한 내용은 아래글을 참고하시고,

 

velog.io/@aonee/Python-%EC%9E%90%EB%A3%8C%ED%98%95%EC%9D%98-%EA%B0%92-%EC%A0%80%EC%9E%A5-%EB%B3%B5%EC%82%AC-copy

 

[Python] 얕은복사 깊은복사 ([:], copy(),deepcopy)

📌 자료형의 값 저장 📝 동일한 값인지 확인 👉 동일한 값 📝 리스트를 복사 (다른 주소를 가리키도록) 1. [:] 이용 2. copy 모듈 이용

velog.io

copy deepcopy 를 쓰게 되면 속도 문제가 신경쓰이는 데 이것도 잘 정리된 글이 있다.

Slicing 을 이용해라는 말씀이시네~~

list_a = [i for i in range(10000000)]
list_b = deepcopy(list_a)


# slicing 이용
# time : 0.6562941074371338
list_a = [i for i in range(10000000)]
list_b = list_a[:]

2차원 배열의 경우에는 아래처럼

list_a = [[i for i in range(1000)] for _ in range(1000)]
list_b = [item[:] for item in list_a]

 

velog.io/@emplam27/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EC%9D%98-%EA%B9%8A%EC%9D%80%EB%B3%B5%EC%82%AC%EB%8A%94-deepcopy%EA%B0%80-%EB%B9%A0%EB%A5%BC%EA%B9%8C-slicing%EC%9D%B4-%EB%B9%A0%EB%A5%BC%EA%B9%8C

 

[파이썬] 리스트의 깊은복사는 deepcopy가 빠를까? slicing이 빠를까?

리스트의 깊은복사는 어떤게 더 빠를까?

velog.io

참고용

wikidocs.net/16038

mutable immutable 객체 집합

 

BJ.

말레이시아 쌍둥이 빌딩 양쪽 복사를 기가막히게 ㅋㅋ

Nafis Abman 님의 사진, 출처: Pexels