• 지금까지 우리가 숫자, 리스트, 튜플 등의 자료형을 정의하면서 사용했던 것이 변수이다.
  • 숫자, 리스트, 튜플 등의 자료형을 저장하면서 이름을 붙인 것이 변수이다.
  • 자료형을 선언하는 순간 데이터가 메모리에 저장되는데, 변수는 메모리공간에 접근하기 위한 수단이 된다.

1. 변수란?


a = 1 # a라는 변수를 선언하고 숫자 자료형 1을 저장했다.
b = ['a',20,(2,3)] # b라는 변수를 선언하고 문자,숫자,튜플을 요소로 가지는 리스트를 저장했다.

 

  • 변수를 선언할 때에는 = 기호를 사용하는데 이는 할당을 한다는 의미이다.
  • 변수를 선언하는 일반적인 방법은 :: 변수명 = 저장할 자료 :: 이다.
  • 조금 더 깊게 들어가자면, 변수는 객체(object)를 가르키는 레퍼런스(reference)이다. 다른 말로 변수가 객체를 참조한다고 한다.
  • 객체란 프로그램에서 만든 자료, 함수 등 모든 데이터를 뜻한다.
  • 가령 a=1이라고 선언하는 순간 1이라는 숫자 자료형(객체)가 메모리에 생성되고 a는 그곳을 가르키는 레퍼런스이다.
a=10
b=10

 

  • 10은 하나의 정수형 객체이다. 변수 a와 b는 모두 메모리공간에 생성된 정수 자료형 10을 가르킨다.
  • 10이 서로 다른 메모리 공간에 2개 만들어지고 a와 b가 각각 가르키는 것이 아니다.
print(a is b) # True

 

  • is 는 두 변수가 동일한 객체를 가르키는지 판단하는 함수이다. 참이면 1, 거짓이면 0을 반환한다.
import sys
print(sys.getrefcount(10)) # 14

 

sys 라이브러리를 import 하여 라이브러리에 포함된 getrefcount 함수를 사용하면 정수 10의 참조 갯수를 알 수 있다.
위에서 2가 아닌 14가 나온 이유는 이미 파이썬에서 내부적으로 정수 10을 참조했기 때문이다.

c=10
print(sys.getrefcount(10)) # 15
d=10
print(sys.getrefcount(10)) # 16

 

10을 참조하는 변수를 추가할수록 getrefcount 함수의 리턴값이 1씩 증가하는 것을 볼 수 있다.

 

 

2. 변수 선언방법


var = 10 # 일반적인 변수

[a,b] = ['ok','no'] # 리스트형 변수 선언
print([a,b]) # ['ok','no']
print([a,b][0]) # 'ok'
print([a,b][1]) # 'no'

(a,b) = [1,'hello'] # 튜플형 변수 선언

a = b = c = 10 # 여러개의 변수에 하나의 객체 대입
print(a) # 10
print(b) # 10
print(c) # 10

a=10
b=20
a,b = b,a # a와 b의 값을 바꿈
print(a) # 20
print(b) # 10

 

 

 

3. 변수 삭제


a = 10
b = 20
print(a)
print(b)
del a # 변수 a 삭제
del b # 변수 b 삭제

 

 

 

 

4. 리스트 복사


a = [1,2,3]
b = a # 변수 b에 리스트 a를 대입
print(b) # [1,2,3]
a[0] = 10 # a[0]의 값을 1에서 10으로 변경
print(a) # [10,2,3]
print(b) # [10,2,3]

 

  • a[0]을 바꿨는데 리스트 b의 b[0]도 바뀌었다.
  • b = a의 선언에서 단순히 a의 리스트 값만 복사되어 b가 참조하는 것이 아니다.
  • b = a의 선언의 의미는 변수 b가 변수 a와 완전히 동일한 메모리공간의 리스트를 참조하도록 한 것이다.
a = [1,2,3]
b = a[:] # 리스트 a와 값만 같은 다른 리스트를 가르키도록 :를 사용하여 선언
a[0] = 10 # a[0]의 값을 10으로 변환
print(a) # [10,2,3]
print(b) # [1,2,3]

 

  • 이번에는 a[0]을 바꾸어도 b[0]의 값은 바뀌지 않았다.
  • a와 b가 서로 다른 리스트를 참조하기 때문이다.
from copy import copy #이해는 뒤로 미루고 copy함수를 사용하기 위한 선언이라는 것만 알아두자.
a = [1,2,3]
b = copy(a) # b = a[:] 와 동일한 선언이다.
a[0] = 10
print(a) # [10,2,3]
print(b) # [1,2,3]

a = [1,2,3]
b = a
c = a[:]
d = copy(a)

print(a is b) # True
print(a is c) # False
print(a is d) # False

is 함수를 사용하여 두 변수가 서로 같은 객체를 참조하는지 알 수 있다. 같은 객체를 참조하면 True, 아니면 False 리턴

+ Recent posts