이때까지, 파이썬 자료형에 대해서 알아봤는데 그 자료형들이 저장되는 변수에 대해서 알아보겠습니다.
이전 글에서 순수객체지향을 설명하면서 언급했었는데, 동일한 내용입니다.
2020/07/30 - [Language/Python] - [Python/파이썬] 파이썬에 대해서
a = 1 b = 'Python' c = [1, 2, 3]
자료형에 대해서 배우면서 우리는 위와 같은 표현을 봤습니다. 이때, a, b, c를 변수라고 하며, 변수를 생성할 때는 =(assignment) 기호를 사용합니다.
C/C++이나 JAVA에서는 변수를 만들 때 자료형을 명시해주어야 하지만, 파이썬은 변수에 지정된 값을 보고 판단하여 자동으로 자료형이 지정됩니다.
그리고 C/C++이나 JAVA와는 다르게 파이썬에서 사용하는 변수는 값 자체를 저장하는 용도가 아니라, 객체를 가리키는 것입니다. 즉, 포인터(Pointer)개념으로 사용됩니다. 객체는 int, float, string, list, tuple 등을 가리킵니다.
다시 말하자면, 위 코드처럼 a = 1 이라고 입력하면 1의 값을 가지는 정수형 객체가 자동으로 메모리에 생성되고, a는 1(정수형 객체)이 저장된 메모리 주소를 가리키게 됩니다. c = [1, 2, 3]에서, c는 [1, 2, 3] 리스트 객체가 저장된 메모리 주소를 가리키게 됩니다.
각 변수가 가리키는 메모리 주소는 id(변수명)으로 확인할 수 있습니다.

위에서 리스트 a의 변수의 메모리 주소 값은 2532158886472 임을 알 수 있습니다.
이러한 특성 때문에 리스트를 복사하고자 할 때 혼동하기 쉽습니다.
아래 코드를 살펴봅시다.
a = [1, 2, 3] b = a
리스트 a를 생성하고 b 변수에 a를 대입하면 어떻게 될까요 ?
b에 a값을 가지고 새로운 리스트를 만든 것이 아니라, a가 가리키는 주소값을 그대로 b에 대입한 것입니다.
id 함수로 메모리 값을 확인해보면 동일하다는 것을 알 수 있습니다.

그리고 동일한 객체를 가리키고 있는지 판단하는 파이썬 명령어 is를 사용해보면, a와 b는 동일한 객체라는 것을 알 수 있습니다.
여기서 a리스트의 요소값을 변경해봅시다.

a와 b는 모두 같은 객체를 가리키고 있기 때문에 위와 같은 결과가 나오게 됩니다.
따라서, 리스트를 복사할 때는 다른 방법이 필요합니다.
1. [:] 사용
첫 번째 방법은 리스트 전체를 가리키는 [:]를 사용하여 복사하는 방법입니다.

2. copy 모듈 사용
두 번째는 copy 모듈을 사용하는 방법입니다. from copy import copy 부분은 모듈 사용에 관련된 내용인데, 추후에 알아보도록 하겠습니다.
from copy import copy b = copy(a)

위 예제에서 b 와 a는 다른 객체라는 것을 알 수 있습니다.
변수를 만드는 다양한 방법
a, b = ('python', 'life') # tuple로 a, b 값 대입 (a, b) = 'python', 'life' # tuple로 a, b 값 대입 [a, b] = [1, 2] # list로 a, b 값 대입 a = b = 'python'
변수 a, b를 튜플이나 리스트로 변수를 만들 수 있으며, 여러 개의 변수에 같은 값을 대입할 수도 있습니다.
또한 두 변수의 값을 아래와 같이 간단히 변경할 수 있습니다.
a = 3 b = 5 a, b = b, a a # 5 b # 3
이때까지 a, b, c 등 간단히 이름은 변수명으로 지정했지만, 다른 변수명을 지을 때 아래와 같은 규칙을 따라야 합니다.
1. 변수명에는 알파벳 문자(대/소 구분), 숫자, 밑줄(_)을 사용할 수 있다.
2. 변수명의 첫 문자는 알파벳 문자와 밑줄(_)이어야 한다. 즉, 첫 문자로 숫자를 사용할 수 없다.
3. 파이썬의 키워드(ex, True, None, class, break 등등)은 변수명으로 사용할 수 없다.
[리터럴 상수]
리터럴 상수는 2, 1.5 와 같은 숫자나, 'Python', "Hello World"와 같은 문자열 등을 말합니다.
리터럴(literal) 상수라고 불리는 이유는 이 값들이 프로그램 내에서 문자 형태로 지정되는 값이기 때문입니다. 이 값들은 한 번 지정되면 변하지 않고, 변경할 수 없습니다. 숫자 2는 언제나 2라는 숫자임을 나타내게 됩니다.
+)
변수 x에 100이라는 숫자 대입하게 되면, 우선 메모리 상에 100이라는 값이 객체로 할당됩니다. 그리고 그 변수 x에는 100이라는 객체의 주소가 저장됩니다. 즉, 변수 x는 100이라는 값의 객체를 가리키고 있는 것입니다.
여기서 변수 y에 다시 100이라는 숫자를 대입했을 때, x와 y가 가리키는 주소는 어떻게 될까요 ?
상식적으로는 다른 객체 주소를 가리킬 것 같지만, 결과를 보면 동일한 id를 가리키는 것을 볼 수 있습니다.

두 변수가 서로 같은 객체를 가리키고 있는 것을 알 수 있습니다. 같은 값을 가지는 객체를 다른 주소에 중복해서 만들면 메모리가 낭비되기 때문에 파이썬에서는 같은 값을 가지는 객체를 재활용하는 것입니다.
그렇다고 값이 같다고 항상 이 방법이 적용되는 것은 아닙니다.
변수 x와 y에 1000을 각각 대입하고, 주소를 비교해봅시다.

결과에서 볼 수 있듯이 두 변수의 주소가 다르다는 것을 볼 수 있습니다.
이처럼 파이썬은 값이 같다고 무조건 같은 객체를 재활용하는 것은 아니고, 자주 사용할 것 같은 값에 대해서만 메모리에 한 번만 할당하고, 이것을 다른 변수들이 가리킬 수 있도록 합니다. 이때 자주 사용되는 값은 Integer 기준으로 256까지를 의미합니다.

String의 경우에는 문자열에 영문자나 숫자가 아닌 값이나 띄어쓰기가 존재할 때 다른 메모리에 저장해서 가리키게 되고, 띄어쓰기 없이 영문자와 숫자로만 이루어진 경우에는 같은 주소값을 가리키게 됩니다.

(충분히 많은 case를 테스트한 것이 아니라 영문자와 숫자 외에 다른 경우도 있을 수도 있음)
- Reference
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
'프로그래밍 > Python' 카테고리의 다른 글
[Python/파이썬] 함수 / 람다표현식(Lambda Expression) (2) | 2020.08.21 |
---|---|
[Python/파이썬] 제어문과 반복문 (If/While/for) (0) | 2020.08.19 |
[Python/파이썬] 파이썬 기본 자료형 2(리스트, 튜플, 딕셔너리, 집합) (0) | 2020.08.11 |
[파이썬/Python] 파이썬 기본 자료형 1(숫자형, 문자열, bool형, None) (0) | 2020.08.10 |
[Python/파이썬] 파이썬에 대해서 (0) | 2020.07.30 |
댓글