항상 궁금하던 건데, 파이썬은 막쓰기 좋은데 불안해~~~
일단 변수에 다른 변수를 대입하는 형태로 하면 기본적으로는 포인터 교환처럼 같은 곳을 가리키는 포인터 값을 공유하는 느낌.
from docs.python.org/ko/3/library/copy.html
파이썬에서 대입문은 객체를 복사하지 않고, 대상과 객체 사이에 바인딩을 만듭니다.가변(mutable) 컬렉션 또는 가변(mutable) 항목들을 포함한 컬렉션의 경우때로 컬렉션을 변경하지 않고 사본을 변경하기 위해 복사가 필요합니다.
요상하게 2가지 타입이 있어서 동작이 다르게 된다고 하니 그게 좀 문제
mutable , immutable
대충 내가 이해하기 위해 적어논 원칙,
mutable 은 그냥 복사한 대로 그대로 사용만 되고, (즉 문자열같은 경우 문자열 내에 일부 문자열을 바꿀 수 없다는 뜻) 단, 재할당은 새로운 곳에 다시 만들게 되므로 가능
immutable 은 복사한 놈이든 원본놈이든 같이 바꿀 수 있다. 이 경우에도 재할당을 하면 새로운 개체가 만들어지니 별도로 움직이게 된다.
자세한 내용은 아래글을 참고하시고,
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]
참고용
BJ.
Nafis Abman 님의 사진, 출처: Pexels
'IT > 파이썬' 카테고리의 다른 글
파이썬 pyside2 IP address 입력 창 만들기 - PyQt5 QLineEdit (0) | 2021.03.19 |
---|---|
파이썬 여러 widget 이 하나의 슬롯(callback/signal) 함수 사용하기 (0) | 2021.03.16 |
파이썬 getattr 함수란? - 문자열 변수값과 동일한 객체 속성 불러오기 (0) | 2021.03.02 |
파이썬 pyside2 layout에 버튼, 라벨 위젯 추가시에 쓰는 함수 (0) | 2021.02.27 |
파이썬 pyside2 버튼 글자 왼쪽 정렬 (0) | 2021.02.26 |