변수

변수의 역할과 성격에 대해 좀 더 자세히 알아본다.

  • 변수란 무엇인가?
  • 변수 비교: id 함수, == 함수, is 함수의 활용

변수란 무엇인가?

변수는 모든 프로그래밍언어의 기본요소 중 하나이다. 변수는 특정 객체(object)를 대신하는 역할을 수행한다.

In [2]: a = 2
        b = a + 3
        b
Out[2]: 5

위 코드에서 a는 숫자 2를 대신하는 역할을 수행하며, 따라서 b는 숫자 5를 대신하게 된다.

하지만 프로그래밍언어에 따라 변수와 특정 값을 연결하는 방식은 조금씩 다르다. 예를 들어 C 언어의 경우는 일반 변수와 포인터 변수 등 두 종류의 변수를 사용한다. 두 종류의 변수의 차이점을 이해하는 것이 C 언어를 잘 아는가의 척도일 정도로 매우 중요하다.

반면에 파이썬의 경우는 한 종류의 변수만 사용하며, 파이썬의 경우 모든 변수는 포인터 변수이다. 따라서 변수와 특정 값을 연결하는 것을 C 언어의 포인터처럼 "특정 값을 가리킨다"라고 말하는 것이 정확하다. 영어로 하면 reference to objects 이다. 하지만 일반적으로 포인터에 대해 신경쓸 필요가 거의 없다.

예제들을 통해 파이썬에서 "변수의 값 할당"이 어떻게 작동하는지를 살펴본다.


In [1]:
a = [0, 2, 4, 6]

In [2]:
a


Out[2]:
[0, 2, 4, 6]

In [3]:
b = a

In [4]:
b


Out[4]:
[0, 2, 4, 6]

In [5]:
b[1]


Out[5]:
2

In [6]:
c = [0, 2, 4, 6]

In [7]:
c


Out[7]:
[0, 2, 4, 6]

b는 리스트이기에 원소들의 값을 변경할 수 있다.


In [8]:
b[1] = 10

In [9]:
b


Out[9]:
[0, 10, 4, 6]

그런데 b 뿐만 아니라 a도 변경됨을 알 수 있다.


In [10]:
a


Out[10]:
[0, 10, 4, 6]

In [11]:
c


Out[11]:
[0, 2, 4, 6]

id 함수, == 함수, is 함수의 활용

그렇다면 ab는 동일한 객체를 가리키고 있음을 알 수 있다. 따라서 ab의 동일성 여부를 물으면 True라고 되돌려 준다.


In [12]:
a is b


Out[12]:
True

In [13]:
a is c


Out[13]:
False

두 변수의 동일성 여부는 각 변수가 가리키는 메모리주소를 확인하면 된다. id 함수를 이용한다.


In [14]:
id(a)


Out[14]:
4388670856

In [15]:
id(b)


Out[15]:
4388670856

In [16]:
id(c)


Out[16]:
4388750112

ab가 가리키는 주소가 동일함이 확인되었다. 이 경우 ab가 가리키는 주소의 값 또한 동일하므로 a == b의 값도 True이다.


In [17]:
a == b


Out[17]:
True

In [18]:
d = [0, 10, 4, 6]

In [19]:
a == d


Out[19]:
True

반면에 두 변수가 가리키는 주소가 다른 경우에는 약간이 혼돈이 발생할 수 있다.


In [20]:
c = 1
d = 1.0

In [21]:
id(c)


Out[21]:
4302345928

In [22]:
id(d)


Out[22]:
4298741728

In [23]:
c == d


Out[23]:
True

cd는 서로 다른 메모리 주소를 가리키고 있다. 따라서 cd는 동일하지 않다. 즉


In [24]:
c is d


Out[24]:
False

반면에 cd에 할당된 값은 동일하다. 즉


In [25]:
c == d


Out[25]:
True

파이썬 내부에서 변수의 이름, 메모리 상태 등이 어떻게 변하는지를 확인하고자 하면 아래 사이트를 이용할 수 있다. 파이썬 뿐만아니라 자바 코드도 실행할 수 있다.

http://pythontutor.com/

위 사이트에서 에를 들어 아래 코드를 입력하고 "Visualize Execution" 버튼을 눌러보도록 하자.

a = [1, 2, 3]
b = a
c = [1, 2, 3]
print(a is b)
print(a is c)
print(a == b)
print(a == c)
print(b is c)
print(b == c)

"Visualize Execution" 버턴을 누룬 후 "Forward" 버튼을 연속적으로 누르면서 화면 오른쪽에서 그림이 어떻게 변하는지 살펴보아야 한다.

파이썬에는 포인터 변수만 있다는 사실을 이제 어렴풋이 이해할 수 있어야 한다.

위 예제를 파이썬튜토어에서 사용하면 아래와 같이 작동한다.


In [26]:
%load_ext tutormagic

In [27]:
%%tutor

a = [1, 2, 3]
b = a
c = [1, 2, 3]
print(a is b)
print(a is c)
print(a == b)
print(a == c)
print(b is c)
print(b == c)