pyton의 변수, 대입연산, immutable/mutable, 얕은복사/깊은복사

김상윤·2022년 1월 20일
0

python

목록 보기
2/13

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
# a[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

0개의 댓글