자료형 4. 불 자료형, 변수

변현섭·2023년 7월 26일
0

7. 불 자료형

Bool 자료형은 C/C++과 Java를 학습한 경우 이미 잘 알고 있을 것이기 때문에 간단히만 설명하기로 한다. 파이썬에서 자료형의 참과 거짓은 아래와 같이 평가된다.

정리하면 문자열, 리스트, 튜플, 딕셔너리 등의 값이 비어있으면 거짓이 되고, 비어있지 않으면 참이 된다. 숫자의 경우는 0을 제외한 모든 수를 참으로 본다.

여기서, None은 null과 비슷한 파이썬만의 특별상수이다. 가끔 None을 Bool 자료형의 false와 동일하게 생각하는 사람도 있는데, None이 false 취급을 받는다고 해서 false 그 자체인 것은 아니다. 마치 null이 곧 false라고 이야기하지 않는 것과 같다.

8. 변수

변수 역시도 프로그래밍을 배운 경험이 있다면, 굳이 자세히 배울 필요가 없다. 하지만, 프로그래밍을 자주 접한 사람조차 헷갈리는 부분 중에 하나가 바로 "얕은 복사"와 "깊은 복사"이다. 이 부분에 대해서 짚고 넘어가기로 하자.

※ 얕은 복사 Vs 깊은 복사
얕은 복사는 객체를 복사할 때, 원본과 복사본이 같은 참조(메모리 주소)를 가리키는 것을 의미한다. 즉, 어느 한쪽만 수정해도 둘 다 변경사항이 적용된다. 반면, 깊은 복사는 복사된 객체가 원본과 다른 주소를 참조하는 것을 의미한다. 원본과 복사본은 독립적인 개체가 되어 서로에게 영향을 미치지 않는다.
간혹 얕은 복사와 깊은 복사의 개념을 반대로 아는 사람도 있는데, 아마 "깊은 복사"라는 어감이 원본과 복사본이 서로에 영향을 미치는 느낌을 주기 때문인 것 같다. "얕다"라는 의미를 "포인터를 사용하기 때문에 가볍다"라고 받아들이고 "깊다"라는 의미를 "객체를 가져오기 때문에 무겁다"라고 받아들이면 이해가 쉬울 것이다.

1) 얕은 복사

>>> a = [1, 2, 3]
>>> b = a

위 연산은 리스트 a를 b라는 변수에 복사하고 있는 것이다. 이 때, b는 a와 완전히 동일하다. 우리는 이것을 얕은 복사(Shallow Copy)라고 한다. C++의 개념을 약간만 곁들이면, 변수 a는 리스트의 첫 요소에 대한 포인터 변수로써, 주소를 저장하고 있다. 이 주소를 그대로 b에 전달하고 있는 것이기 때문에, b 또한 a와 같은 주소를 가리키는 포인터 변수가 되는 것이다.

당연히 어느 한 쪽을 수정하더라도 a와 b 모두 수정사항이 반영된다.

>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 4, 3]

2) 깊은 복사

b 변수에 a 변수의 값은 할당하면서 a와는 다른 주소를 참조하게 만들려면 어떻게 해야할까?

① [:] 이용

  • 리스트 전체를 의미하는 [:]을 이용하면 깊은 복사로 취급된다.
>>> a = [1, 2, 3]
>>> b = a[:]
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 2, 3]

② copy 모듈 이용

  • copy 모듈을 이용한 결과도 위와 동일하다. 즉, a와 b는 서로 다른 객체를 가리킨다.
>>> from copy import copy
>>> a = [1, 2, 3]
>>> b = copy(a)

3) 여러 변수에 한 번에 값 할당하기

① 튜플 패킹(Tuple Packing)

  • 튜플을 이용하면 a, b에 한 번에 값을 대입할 수 있다.
  • 튜플은 괄호를 생략할 수 있기 때문에 다양한 표현이 가능하다.
>>> a, b = ('python', 'life')
>>> (a, b) = 'python', 'life'
>>> a, b = 'python', 'life'
  • 물론 리스트를 사용하여 동일한 동작을 수행할 수도 있다.
>>> [a, b] = ['python', 'life']

② 연결된 할당(Chained Assignment)

  • 여러 개의 변수에 같은 값을 대입한다.
>>> a = b = 'python'

③ switch

  • C++에서는 a와 b의 값을 switch하기 위해 temp라는 별도의 변수를 선언하여 temp = a, a = b, b = temp를 순차적으로 수행한다.
  • 반면, 파이썬에서는 단 한 줄의 코드만으로 switching이 가능하다.
>>> a = 3
>>> b = 5
>>> a, b = b, a
>>> a
5
>>> b
3
profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 26일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기