c++과 python의 변수
- c++에서는 기본적으로 변수 생성 시 변수마다 새로운 메모리 공간, 주소를 할당받는다. 후에 다른 변수나 값을 대입하면 해당 공간에 값 data가 저장된다.
- python의 모든 것(정수, 실수, 문자열, 튜플, 리스트, 함수, 프로그램 ..)은 객체(Object)로 구현돼 있다. 변수는 객체를 가리키는 (reference_참조하는) 이름일 뿐이다.
- 변수에 다른 변수 대입 시 같은 객체 참조하게 된다.
Python의 DataType
동적 타입 언어
- python은 동적 타입 언어로 변수들의 데이터 타입이 runtime(실행시점)에 결정된다.
a = 3
print(type(a)) #int
a = "3"
print(type(a)) #str
형변환
- python은 강타입 언어로 모든 자료형 간 implicit암시적 형변환이 되지 않고 에러를 반환한다.
- 숫자 type, bool type 간 암시적 형변환만 지원한다.
a = 1 + "2" #error
print(True+2) #3
immutable / mutable
immutable
- 한 번 생성하면 값을 수정 할 수 없는 객체
- call by value의 속성
- 다른 변수에 같은 value 대입 시 같은 주소값 갖는다.
- 변수의 값을 변경하면 해당 값을 가지는 다른 객체를 (생성&)참조하게 된다.
: 값 변경 시 기존 객체는 변경X
- str 문자열 변수는 값 변경이 불가능하다. 변경 하려면 변수에 새로운 객체를 다시 할당해야 하낟.
mutable
- 값을 수정 할 수 있는 객체
- call by reference 속성
- 다른 변수에 같은 value 대입 시 다른 주소값 갖는다. (대입 시 같은 객체 참조)
- 변수의 값을 변경하면 참조하는 객체의 값을 변경한다.
: 값 변경시 해당 객체 참조하던 모든 변수의 값 같이 변경
parameter - passed by assignment
- Python은 인자를 넘겨 줄 때 call by value / reference를 명시적으로 선택 할 수 없다.
- mutable object -> call by value
- immutable object -> call by reference
얕은복사(ShallowCopy) / 깊은복사(DeepCopy)
- list를 대입연산이 아닌 copy() 함수로 복사 하면 새로운 객체를 참조한다. 즉 다른 주소값을 가진다.
- list_b = list_a 로 복사하면 reference 복사로 같은 객체를 가리키게 된다. (값 변경 공유)
a = [1, 2, 3]
b = a
b[1] = 100
얕은 복사 in list
- list a의 element list l에 대해 (a[2] == l ) 일 때, b에 a를 복사하면
: b는 a와 다른 list 객체를 참조하지만
: b의 element는 a의 element와 같은 list 객체를 참조한다.
a = [3, 7, [1,1,1]]
b = a.copy()
id(a) != id(b)
id(a[2]) == id(b[2])
- a.copy()
: list a를 얕은 복사 한 list 리턴
깊은 복사 in list
- list a의 element list l에 대해 (a[2] == l ) 일 때, b에 a를 복사하면
: b는 a와 다른 list 객체를 참조하고
: b의 element도 a의 element와 다른 list 객체를 참조한다.
a = [3, 7, [1,1,1]]
b = copy.deepcopy(a)
id(a) != id(b)
id(a[2]) != id(b[2])
- copy.deepcopy(a)
: list a를 깊은 복사한 list 리턴
참고
https://null-0.tistory.com/21
https://redthing.tistory.com/entry/%EC%A0%95%EC%A0%81-%ED%83%80%EC%9E%85-%EC%96%B8%EC%96%B4-%EB%8F%99%EC%A0%81-%ED%83%80%EC%9E%85-%EC%96%B8%EC%96%B4-Python
https://dpdpwl.tistory.com/82
https://mimah.tistory.com/64