본문 바로가기
프로그래밍/Python

[Python/파이썬] 파이썬의 변수에 대해서(+리터럴 상수)

by 별준 2020. 8. 11.

이때까지, 파이썬 자료형에 대해서 알아봤는데 그 자료형들이 저장되는 변수에 대해서 알아보겠습니다.

이전 글에서 순수객체지향을 설명하면서 언급했었는데, 동일한 내용입니다.

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

https://wikidocs.net/book/1

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

댓글