파이썬 변수저장
변수는 어떻게 만들까?
우리는 앞에서 이미 변수들을 사용해 왔다. 다음 예와 같은 a, b, c를 변수라고 한다.
>>> a = 1
>>> b = "python"
>>> c = [1,2,3]
변수를 만들 때는 위의 예처럼 =(assignment) 기호를 사용한다.
C 언어나 Java처럼 변수의 자료형을 함께 쓸 필요는 없다. 파이썬은 변수에 저장된 값을 스스로 판단하여 자료형을 알아낸다.
변수명 = 변수에 저장할 값
변수란?
파이썬에서 사용하는 변수는 객체를 가리키는 것이라고도 말할 수 있다. 객체란 우리가 지금껏 보아 왔던 자료형과 같은 것을 의미하는 말이다. (객체에 대해서는 클래스 챕터에서 보다 자세하게 공부한다.)
>>> a = [1, 2, 3]
만약 위의 코드처럼 a = [1, 2, 3]
이라고 하면 [1, 2, 3]
이라는 값을 가지는 리스트 자료형(객체)이 자동으로 메모리에 생성되고 변수 a는 [1, 2, 3]
이라는 리스트가 저장된 메모리의 주소를 가리키게 된다.
a변수가 가리키는 메모리의 주소는 다음과 같이 확인할 수 있다.
>>> a = [1, 2, 3]
>>> id(a)
4303029896
id 함수는 변수가 가리키고 있는 객체의 주소를 리턴해 주는 파이썬 내장함수이다. 즉, a가 가리키고 있는 [1, 2, 3]
이라는 리스트의 주소는 4303029896 임을 알 수 있다.
리스트를 변수에 넣고 복사하고자 할 때
여기서는 리스트 자료형에서 가장 혼동하기 쉬운 "복사"에 대해 설명하려고 한다. 다음 예를 통해 알아보자.
>>> a = [1,2,3]
>>> b = a
b변수에 a변수를 대입하면 어떻게 될까? b와 a는 같은걸까? 아니면 다른 걸까? 결론부터 얘기하면 b는 a와 완전히 동일하다고 할 수 있다. 다만 [1, 2, 3]
이라는 리스트를 참조하는 변수의 갯수가 a변수 1개에서 b변수가 추가되어 2개가 되었다는 차이가 있을 뿐이다.
id 명령을 이용하면 이러한 사실을 증명할 수 있다.
>>> id(a)
4303029896
>>> id(b)
4303029896
id(a)
의 값이 id(b)
의 값과 동일함을 확인할 수 있다. 즉, a가 가리키는 대상과 b가 가리키는 대상이 동일하다는 것을 알수 있다.
동일한 객체를 가리키고 있는지 아닌지에 대해서 판단하는 파이썬 명령어인 is 를 다음과 같이 실행해도 역시 참(True)을 리턴하게 된다.
>>> a is b # a와 b가 가리키는 객체는 동일한가?
True
이제 다음 예를 계속해서 수행해 보자.
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 4, 3]
a 리스트의 두번째 요소를 4라는 값으로 바꾸었더니 a만 바뀌는 것이 아니라 b도 똑같이 바뀌었다. 그 이유는 앞서 살펴본 것처럼 a, b 모두 동일한 리스트를 가리키고 있기 때문이다.
그렇다면 b 변수를 생성할 때 a와 같은 값을 가지도록 복사해 넣으면서 a가 가리키는 리스트와는 다른 리스트를 가리키게 하는 방법은 없을까? 다음의 2가지 방법이 있다.
1. [:] 이용
첫 번째 방법으로는 아래와 같이 리스트 전체를 가리키는 [:]을 이용해서 복사하는 것이다.
>>> a = [1, 2, 3]
>>> b = a[:]
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 2, 3]
위의 예에서 볼 수 있듯이 a 리스트 값을 바꾸더라도 b 리스트에는 영향을 끼치지 않는다.
2. copy 모듈 이용
두 번째는 copy 모듈을 이용하는 방법이다. 아래 예를 보면 from copy import copy라는 처음 보는 형태가 나오는데, 이것은 뒤에 설명할 파이썬 모듈 부분에서 자세히 다룬다. 여기서는 단순히 copy라는 함수를 쓰기 위해서 사용되는 것이라고만 알아두자.
>>> from copy import copy
>>> b = copy(a)
위의 예에서 b = copy(a)는 b = a[:]과 동일하다.
두 변수가 같은 값을 가지면서 다른 객체를 제대로 생성했는지 다음과 같이 확인 해 보자.
>>> b is a
False
위의 예에서 b is a 가 False를 리턴하므로 b와 a가 서로 다른 객체임을 알 수 있다.
변수를 만드는 여러 가지 방법
>>> a, b = ('python', 'life')
위의 예문처럼 튜플로 a, b에 값을 대입할 수 있다. 이 방법은 다음 예문과 완전히 동일하다.
>>> (a, b) = 'python', 'life'
튜플 부분에서도 언급했지만 튜플은 괄호를 생략해도 된다.
아래처럼 리스트로 변수를 만들 수도 있다.
>>> [a,b] = ['python', 'life']
또한 여러 개의 변수에 같은 값을 대입할 수도 있다.
>>> a = b = 'python'
파이썬에서는 위의 방법을 이용하여 두 변수의 값을 아주 간단히 바꿀 수 있다.
>>> a = 3
>>> b = 5
>>> a, b = b, a
>>> a
5
>>> b
3
처음에 a에 3, b에는 5라는 값이 대입되어 있었지만 a, b = b, a라는 문장을 수행한 후에는 그 값이 서로 바뀌었음을 확인할 수 있다.