변수는 모든 프로그래밍언어의 기본요소 중 하나이다. 변수는 특정 객체(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]:
In [3]:
b = a
In [4]:
b
Out[4]:
In [5]:
b[1]
Out[5]:
In [6]:
c = [0, 2, 4, 6]
In [7]:
c
Out[7]:
b
는 리스트이기에 원소들의 값을 변경할 수 있다.
In [8]:
b[1] = 10
In [9]:
b
Out[9]:
그런데 b
뿐만 아니라 a
도 변경됨을 알 수 있다.
In [10]:
a
Out[10]:
In [11]:
c
Out[11]:
그렇다면 a
와 b
는 동일한 객체를 가리키고 있음을 알 수 있다.
따라서 a
와 b
의 동일성 여부를 물으면 True라고 되돌려 준다.
In [12]:
a is b
Out[12]:
In [13]:
a is c
Out[13]:
두 변수의 동일성 여부는 각 변수가 가리키는 메모리주소를 확인하면 된다. id
함수를 이용한다.
In [14]:
id(a)
Out[14]:
In [15]:
id(b)
Out[15]:
In [16]:
id(c)
Out[16]:
a
와 b
가 가리키는 주소가 동일함이 확인되었다. 이 경우 a
와 b
가 가리키는 주소의 값 또한 동일하므로 a == b
의 값도 True
이다.
In [17]:
a == b
Out[17]:
In [18]:
d = [0, 10, 4, 6]
In [19]:
a == d
Out[19]:
반면에 두 변수가 가리키는 주소가 다른 경우에는 약간이 혼돈이 발생할 수 있다.
In [20]:
c = 1
d = 1.0
In [21]:
id(c)
Out[21]:
In [22]:
id(d)
Out[22]:
In [23]:
c == d
Out[23]:
c
와 d
는 서로 다른 메모리 주소를 가리키고 있다. 따라서 c
와 d
는 동일하지 않다. 즉
In [24]:
c is d
Out[24]:
반면에 c
와 d
에 할당된 값은 동일하다. 즉
In [25]:
c == d
Out[25]:
파이썬 내부에서 변수의 이름, 메모리 상태 등이 어떻게 변하는지를 확인하고자 하면 아래 사이트를 이용할 수 있다. 파이썬 뿐만아니라 자바 코드도 실행할 수 있다.
위 사이트에서 에를 들어 아래 코드를 입력하고 "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)