본문 바로가기

Data Engineering

파이썬은 모든 것이 객체다, is와 이항 연산자...

파이썬은 모든 것이 객체다.

이 중에서 크게 불변 객체(immutable object)와 가변 객체(mutable object)로 구분할 수 있따.

클래스 설명 불변 객체
bool 부울 O
int 정수 O
float 실수 O
list 리스트 X
tuple 리스트와 튜플의 차이는 불변 여부이며 이외에는 거의 동일하다. 튜플은 불변이므로 생성할 때 설정한 값은 변경할 수 없다. O
str 문자 O
set 중복된 값을 갖지 않는 집합 자료형 X
dict 딕셔너리 X

 

불변 객체

무엇보다 파이썬은 모든 것이 객체다. 파이썬에서 변수를 할당하는 작업은 해당 객체에 대해 참조를 한다는 의미다.

여기에는 예외가 없으며 심지어 문자와 숫자도 모두 객체다.

10
a = 10
b = a
id(10), id(a), id(b)
# (4393858752, 4393858752, 4393858752)

위의 예를 통해서 간단히 확인할 수 있다. 10, a, b는 모두 같은 메모리상에 위치한 객체의 주소를 얻어온다. 만약 모두 원시타입이라면 각각의 값들은 각 메모리의 다른 영역에 위치할 것이다.

 

 

가변 객체

가변 시퀀스 중 하나로 리스트가 있다. int, str과는 다르게 list는 값이 바뀔 수가 있으며, 이 말은 다른 변수가 참조하고 있을 때 그 변수의 값 또한 변경된다는 얘기다.

a = [1, 2, 3, 4, 5]
b = a
b
# [1, 2, 3, 4, 5]
a[2] = 4
a
# [1, 2, 4, 4, 5]
b
# [1, 2, 4, 4, 5]

위의 예를 보면, a의 요소 하나를 조작해서 값을 변경했을 때, b의 같은 위치 요소의 값도 변경된 것을 볼 수 있다.

 


C++의 참조와 비교

C++의 참조 방식은 파이썬의 참조 할당 방식과는 조금 다르다.

 

is와 ==(이항 연산자)

파이썬의 비교 연산자는 파이썬의 객체 구조와 관련이 깊다.

  • is : id( ) 값을 비교하는 함수다. 
  • == : 값을 비교하는 연산자다. 

None은 널(null)로써 값 자체가 정의되어 있지 않으므로 ==로 비교가 불가능하다.

a = [1, 2, 3]
a == copy.deepcopy(a)
# True
a is copy.deepcopy(a)
# False

copy.deepcopy()로 복사한 결과 또한 값은 같지만 ID는 다르기 때문에 ==로 비교하면 True, is 로 비교할 경우 False가 된다.

 

* 파이썬에는 자바스크립트에서 아주 익숙한 삼항 연산자는 없다.