02-1 숫자형

  • 숫자형(Number): 숫자 형태로 이루어진 자료형
항목 사용 예
정수 123, -345, 0
실수 123.45, -1234.5, 3.4e10
8진수 0o34, 0o25
16진수 0x2A, 0xFF

숫자형을 활용하기 위한 연산자

In [3]:
# 사칙연산

a = 3
b = 4

print(a+b)
print(a*b)
print(a/b)
7
12
0.75
In [4]:
# 제곱 ** 연산자

a = 3
b = 4
print(a**b)

# 나눗셈 후 나머지를 반환하는 % 연산자

print(7%3)
print(3%7)

# 나눗셈 후 소수점 아랫자리를 버리는 // 연산자

print(7//4)
print(-7//4) # 무조건 소수점을 버리는 것이 아니라 나눗셈의 결과값보다 작은 정수 중, 가장 큰 정수를 리턴한다.
81
1
3
1
-2

02-2 문자열 자료형

  • 문자열(String): 문자, 단어 등으로 구성된 문자들의 집합
    • "Life is too short, You need Python"
    • "a"
    • "123"

문자열은 어떻게 만들고 사용할까?

파이썬에서 문자열을 만드는 4가지 방법

  1. 큰따옴표로 양쪽 둘러싸기: "Hello World"
  2. 작은따옴표로 양쪽 둘러싸기: 'Python is fun'
  3. 큰따옴표 3개를 연속으로 써서 양쪽 둘러싸기: """Life is too short, You need python"""
  4. 작은따옴표 3개를 연속으로 써서 양쪽 둘러싸기: '''Life is too short, You need python'''

문자열 안에 작은따옴표나 큰따옴표를 포함시키고 싶을 때

1) 문자열에 작은따옴표(') 포함시키기: Python's favorite food is perl

다음과 같이 문자열을 큰따옴표(")로 둘러싸야 한다.

>>> food = "Python's favorite food is perl"

2) 문자열에 큰따옴표(") 포함시키기: "Python is very easy." he says.

다음과 같이 문자열을 작은따옴표(')로 둘러싸야 한다.

>>> sqy = '"Python is very easy." he says.'

3) \ (백슬래시)를 이용해서 작은따옴표(')와 큰따옴표(")를 문자열에 포함시키기

>>> food = 'Python\'s favorite food is perl'
>>> say = "\"Python is very easy.\" he says."

여러 줄인 문자열을 변수에 대입하고 싶을 때

1) 줄을 바꾸기 위한 이스케이프 코드 \n 삽입하기

>>> multiline = "Life is too short \n You need python"

2) 연속된 작은따옴표 3개(''') 또는 큰따옴표 3개(""") 이용

>>> multiline = '''
Life is too short
You need python
'''

문자열 연산하기

1) 문자열 더해서 연결하기(Concatenation)

In [5]:
head = "Python"
tail = " is fun!"

head + tail
Out[5]:
'Python is fun!'

2) 문자열 곱하기

In [6]:
a = "python"
a * 2
Out[6]:
'pythonpython'

3) 문자열 곱하기 응용

In [7]:
print("=" * 50)
print("My Program")
print("=" * 50)
==================================================
My Program
==================================================

문자열 인덱싱과 슬라이싱

문자열 인덱싱이란?

"파이썬은 0부터 숫자를 센다."

In [2]:
a = "Life is too short, You need Python"
a[3]
Out[2]:
'e'

문자열 인덱싱 활용하기

In [2]:
print(a[-2])
print(a[-5])
o
y

문자열 슬라이싱이란?

In [3]:
b = a[0] + a[1] + a[2] + a[3]
b
Out[3]:
'Life'
In [4]:
a[0:4]
Out[4]:
'Life'

문자열을 슬라이싱하는 방법

In [5]:
print(a[0:2])
print(a[5:7])
print(a[12:17])
Li
is
short
In [6]:
a[19:]
Out[6]:
'You need Python'
In [4]:
a[:17]
Out[4]:
'Life is too short'
In [5]:
a[:]
Out[5]:
'Life is too short, You need Python'
In [6]:
a[19:-7]
Out[6]:
'You need'

슬라이싱으로 문자열 나누기

In [7]:
a = "20010331Rainy"
date = a[:8]
weather = a[8:]

print(date)
print(weather)
20010331
Rainy
In [9]:
year = a[:4]
day = a[4:8]
weather = a[8:]

print(year)
print(day)
print(weather)
2001
0331
Rainy

["Pithon" 이라는 문자열을 "Python" 으로 바꾸려면?]

In [10]:
a = "Pithon"
a[1]
Out[10]:
'i'
In [11]:
a[1] = 'y'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-020b3dad23fa> in <module>()
----> 1 a[1] = 'y'

TypeError: 'str' object does not support item assignment
In [12]:
a[:1] + 'y' + a[2:]
Out[12]:
'Python'

문자열 포매팅

문자열 포매팅 따라하기

In [13]:
"I eat %d apples." % 3
Out[13]:
'I eat 3 apples.'
In [14]:
"I eat %s apples." % "five"
Out[14]:
'I eat five apples.'
In [15]:
number = 3
"I eat %d apples." % number
Out[15]:
'I eat 3 apples.'
In [17]:
number = 10
day = "three"
"I ate %d apples. so I was sick for %s days." % (number, day)
Out[17]:
'I ate 10 apples. so I was sick for three days.'

문자열 포맷 코드

코드 설명
%s 문자열(String)
%c 문자 1개(character)
%d 정수(Integer)
%f 부동소수(floating-point)
%o 8진수
%x 16진수
%% Literal % (문자 % 자체)
In [18]:
"Error is %d%" % 98
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-18-86d2e529c9cc> in <module>()
----> 1 "Error is %d%" % 98

ValueError: incomplete format
In [19]:
"Error is %d%%" % 98
Out[19]:
'Error is 98%'

포맷코드와 숫자 함께 사용하기

In [20]:
# 정렬과 공백

"%10s" % "hi"
Out[20]:
'        hi'
In [21]:
"%-10s jane" % "hi"
Out[21]:
'hi         jane'
In [22]:
# 소수점 표현하기

"%0.4f" % 3.42134234
Out[22]:
'3.4213'
In [23]:
"%10.4f" % 3.42134234
Out[23]:
'    3.4213'

문자열 관련 함수들

  • 문자열 내장함수: 문자열 자료형은 자체적으로 가지고 있는 함수들이 있다.
In [24]:
# 문자 개수 세기(count)

a = "hobby"
a.count('b')
Out[24]:
2
In [25]:
# 위치 알려주기 1(find)

a = "Python is best choice"

print(a.find('b'))
print(a.find('k'))
10
-1
In [26]:
# 위치 알려주기 2(index)

a = "Life is too short"

print(a.index('t'))
print(a.index('k'))
8
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-26-f78645f0e8e2> in <module>()
      4 
      5 print(a.index('t'))
----> 6 print(a.index('k'))

ValueError: substring not found
In [27]:
# 문자열 삽입(join)

a = ','
a.join('abcd')
Out[27]:
'a,b,c,d'
In [28]:
# 소문자를 대문자로 바꾸기(upper)

a = "hi"
print(a.upper())

# 대문자를 소문자로 바꾸기(lower)

a = "HI"
print(a.lower())
HI
hi
In [30]:
# 왼쪽 공백 지우기(lstrip)

a = " hi "
a.lstrip()
Out[30]:
'hi '
In [31]:
# 오른쪽 공백 지우기(rstrip)
a.rstrip()
Out[31]:
' hi'
In [32]:
# 양쪽 공백 지우기(strip)
a.strip()
Out[32]:
'hi'
In [33]:
# 문자열 바꾸기(replace)

a = "Life is too short"
a.replace("Life", "Your leg")
Out[33]:
'Your leg is too short'
In [34]:
# 문자열 나누기(split)

a = "Life is too short"
a.split()
Out[34]:
['Life', 'is', 'too', 'short']
In [35]:
a = "a:b:c:d"
a.split(":")
Out[35]:
['a', 'b', 'c', 'd']

[고급 문자열 포매팅]

In [1]:
# 숫자 바로 대입하기

"I eat {0} apples".format(3)
Out[1]:
'I eat 3 apples'
In [2]:
# 문자열 바로 대입하기

"I eat {0} apples".format("five")
Out[2]:
'I eat five apples'
In [3]:
# 숫자 값을 가진 변수로 대입하기

number = 3
'I eat {0} apples'.format(number)
Out[3]:
'I eat 3 apples'
In [4]:
# 2개 이상의 값 넣기

number = 10
day = "three"
"I ate {0} apples. so I was sick for {1} days.".format(number, day)
Out[4]:
'I ate 10 apples. so I was sick for three days.'
In [5]:
# 이름으로 넣기

"I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
Out[5]:
'I ate 10 apples. so I was sick for 3 days.'
In [6]:
# 인덱스와 이름을 혼용해서 넣기

"I ate {0} apples. so I was sick for {day} days.".format(10, day=3)
Out[6]:
'I ate 10 apples. so I was sick for 3 days.'
In [7]:
# 왼쪽 정렬

"{0:<10}".format("hi")
Out[7]:
'hi        '
In [8]:
# 오른쪽 정렬

"{0:>10}".format("hi")
Out[8]:
'        hi'
In [9]:
# 가은데 정렬

"{0:^10}".format("hi")
Out[9]:
'    hi    '
In [10]:
# 공백 채우기

"{0:=^10}".format("hi")
Out[10]:
'====hi===='
In [11]:
"{0:!<10}".format("hi")
Out[11]:
'hi!!!!!!!!'
In [12]:
# 소수점 표현하기

y = 3.42134234
"{0:0.4f}".format(y)
Out[12]:
'3.4213'
In [13]:
"{0:10.4f}".format(y)
Out[13]:
'    3.4213'
In [15]:
# { 또는 } 문자 표현하기

"{{ and }}".format()
Out[15]:
'{ and }'

02-3 리스트 자료형

리스트는 어떻게 만들고 사용할까?

>>> odd = [1, 3, 5, 7, 9]

>>> a = [ ]
>>> b = [1, 2, 3]
>>> c = ['Life', 'is', 'too', 'short']
>>> d = [1, 2, 'Life', 'is']
>>> e = [1, 2, ['Life', 'is']]
  • 비어있는 리스트는 a = list() 로 생성할 수도 있다.

리스트의 인덱싱과 슬라이싱

  • 리스트도 문자열처럼 인덱싱과 슬라이싱이 가능하다.

리스트의 인덱싱

In [2]:
a = [1, 2, 3]

a[0]
Out[2]:
1
In [3]:
a[0] + a[2]
Out[3]:
4
In [4]:
a[-1]
Out[4]:
3
In [5]:
a = [1, 2, 3, ['a', 'b', 'c']]

a[0]
Out[5]:
1
In [6]:
a[-1]
Out[6]:
['a', 'b', 'c']
In [7]:
a[3]
Out[7]:
['a', 'b', 'c']
In [8]:
a[-1][0]
Out[8]:
'a'
In [9]:
a[-1][1]
Out[9]:
'b'

리스트의 슬라이싱

In [1]:
a = [1, 2, 3, 4, 5]
a[0:2]
Out[1]:
[1, 2]
In [2]:
a[:2]
Out[2]:
[1, 2]
In [3]:
a[2:]
Out[3]:
[3, 4, 5]

리스트 연산자

1) 리스트 더하기(+)

In [4]:
a = [1, 2, 3]
b = [4, 5, 6]

a + b
Out[4]:
[1, 2, 3, 4, 5, 6]

2) 리스트 반복하기(*)

In [5]:
a = [1, 2, 3]

a * 3
Out[5]:
[1, 2, 3, 1, 2, 3, 1, 2, 3]

리스트의 수정, 변경과 삭제

1. 리스트에서 하나의 값 수정하기

In [7]:
a = [1, 2, 3]
a[2] = 4

a
Out[7]:
[1, 2, 4]

2. 리스트에서 연속된 범위의 값 수정하기

In [8]:
a[1:2]
Out[8]:
[2]
In [9]:
a[1:2] = ["a", "b", "c"]

a
Out[9]:
[1, 'a', 'b', 'c', 4]
In [10]:
a[1] = ['a', 'b', 'c']

a
Out[10]:
[1, ['a', 'b', 'c'], 'b', 'c', 4]

3. [] 사용해 리스트 요소 삭제하기

In [11]:
a[1:3] = []

a
Out[11]:
[1, 'c', 4]

4. del 함수 사용해 리스트 요소 삭제하기

In [12]:
a
Out[12]:
[1, 'c', 4]
In [13]:
del a[1]

a
Out[13]:
[1, 4]

리스트 관련 함수들

리스트에 요소 추가(append)

In [14]:
a = [1, 2, 3]
a.append(4)

a
Out[14]:
[1, 2, 3, 4]
In [15]:
a.append([5, 6])

a
Out[15]:
[1, 2, 3, 4, [5, 6]]

리스트 정렬(sort)

In [16]:
a = [1, 4, 3, 2]
a.sort()

a
Out[16]:
[1, 2, 3, 4]
In [17]:
a = ['a', 'c', 'b']
a.sort()

a
Out[17]:
['a', 'b', 'c']

리스트 뒤집기(reverse)

In [18]:
a = ['a', 'c', 'b']
a.reverse()

a
Out[18]:
['b', 'c', 'a']

위치 반환(index)

In [19]:
a = [1, 2, 3]
a.index(3)
Out[19]:
2
In [20]:
a.index(1)
Out[20]:
0
In [21]:
a.index(0)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-21-8b50e151dfc5> in <module>()
----> 1 a.index(0)

ValueError: 0 is not in list

리스트에 요소 삽입(insert)

In [22]:
a = [1, 2, 3]
a.insert(0, 4)

a
Out[22]:
[4, 1, 2, 3]
In [24]:
a.insert(3, 5)

a
Out[24]:
[4, 1, 2, 5, 5, 3]

리스트 요소 제거(remove)

In [25]:
a = [1, 2, 3, 1, 2, 3]
a.remove(3) # 첫번째 3만 제거됨

a
Out[25]:
[1, 2, 1, 2, 3]
In [26]:
a.remove(3)

a
Out[26]:
[1, 2, 1, 2]

리스트 요소 끄집어 내기(pop)

In [27]:
# pop()은 리스트의 맨 마지막 요소를 돌려주고 해당 요소는 삭제함

a = [1, 2, 3]
a.pop()
Out[27]:
3
In [28]:
a
Out[28]:
[1, 2]
In [29]:
a = [1, 2, 3]
a.pop(1)
Out[29]:
2
In [30]:
a
Out[30]:
[1, 3]

리스트에 포함된 요소 x의 개수 세기(count)

In [31]:
a = [1, 2, 3, 1]

a.count(1)
Out[31]:
2

리스트 확장(extend)

In [32]:
# extend(x)에서 x에는 리스트만 올 수 있다.

a = [1, 2, 3]
a.extend([4, 5])

a
Out[32]:
[1, 2, 3, 4, 5]
In [33]:
b = [6, 7]
a.extend(b)

a
Out[33]:
[1, 2, 3, 4, 5, 6, 7]
  • a.extend([4, 5])는 a += [4, 5] 와 동일하다

02-4 튜플 자료형

튜플은 어떻게 만들까?

튜플(tuple)은 리스트와 거의 비슷하지만, 다른 점은 다음과 같다.

  • 리스트는 [ 과 ] 으로 둘러싸지만 튜플은 ( 과 ) 으로 둘러싼다.
  • 리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 없다.
>>> t1 = ()
>>> t2 = (1,) # 단지 1개의 요소만을 가질 때에도 요소 뒤에 콤마(,)를 반드시 붙여야 한다.
>>> t3 = (1, 2, 3)
>>> t4 = 1, 2, 3 # 괄호()를 생략해도 무방하다.
>>> t5 = ('a', 'b', ('ab', 'cd'))

튜플 요소값 삭제 또는 변경 시 오류

In [1]:
t1 = (1, 2, 'a', 'b')
del t1[0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-be8ec365afcc> in <module>()
      1 t1 = (1, 2, 'a', 'b')
----> 2 del t1[0]

TypeError: 'tuple' object doesn't support item deletion
In [2]:
t1[0] = 'c'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-38040fd9966c> in <module>()
----> 1 t1[0] = 'c'

TypeError: 'tuple' object does not support item assignment

튜플의 인덱싱과 슬라이싱, 더하기(+)와 곱하기(*)

In [3]:
# 인덱싱하기

t1 = (1, 2, 'a', 'b')
t1[0]
Out[3]:
1
In [4]:
t1[3]
Out[4]:
'b'
In [5]:
# 슬라이싱하기

t1[1:]
Out[5]:
(2, 'a', 'b')
In [6]:
# 튜플 더하기

t2 = (3, 4)

t1 + t2
Out[6]:
(1, 2, 'a', 'b', 3, 4)
In [7]:
# 튜플 곱하기

t2 * 3
Out[7]:
(3, 4, 3, 4, 3, 4)

02-5 딕셔너리 자료형

  • 딕셔너리(Dictionary) 자료형: key 와 value 를 한쌍으로 갖는 자료형
  • 대응 관계를 나타내는 자료형으로 연관 배열(Associative array) 또는 해시(Hash)라고도 한다.
  • 리스트나 튜플처럼 순차적으로 요소에 접근하는 것이 아니고, key를 통해 value를 얻는다.
  • 순서를 따지지 않는다.

딕셔너리는 어떻게 만들까?

  • {Key1:Value1, Key2:Value2, Key3:Value3...}
>>> dic = {'name': 'pey', 'phone': '0119993323', 'birth': '1118'}

딕셔너리 dic의 정보

key value
name pey
phone 0119993323
birth 1118
>>> a = {1: 'hi'} # key로 정수값 1, value로 'hi'라는 문자열을 사용
>>> a = {'a': [1, 2, 3]} # value에 리스트를 사용

딕셔너리 쌍 추가, 삭제하기

In [8]:
# 딕셔너리 쌍 추가하기

a = {1: 'a'}
a[2] = 'b'

a
Out[8]:
{1: 'a', 2: 'b'}
In [10]:
a['name'] = 'pey'

a
Out[10]:
{1: 'a', 2: 'b', 'name': 'pey'}
In [11]:
a[3] = [1, 2, 3]

a
Out[11]:
{1: 'a', 2: 'b', 3: [1, 2, 3], 'name': 'pey'}
In [12]:
# 딕셔너리 요소 삭제하기

del a[1]

a
Out[12]:
{2: 'b', 3: [1, 2, 3], 'name': 'pey'}

딕셔너리를 사용하는 방법

딕셔너리에서 Key 사용해 Value 얻기

In [13]:
grade = {'pey': 10, 'julliet': 99}

grade['pey']
Out[13]:
10
In [14]:
grade['julliet']
Out[14]:
99
In [16]:
dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}

dic['name']
Out[16]:
'pey'
In [17]:
dic['phone']
Out[17]:
'0119993323'
In [18]:
dic['birth']
Out[18]:
'1118'

딕셔너리 만들 때 주의할 사항

  • 중복된 Key를 사용하지 말라.
  • 존재할 경우 하나가 무시된다.
  • key에 리스트를 사용할 수 없다.
In [19]:
a = {1: 'a', 1:'b'}

a
Out[19]:
{1: 'b'}
In [21]:
a = {[1, 2]: 'hi'}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-edc95a1431e0> in <module>()
----> 1 a = {[1, 2]: 'hi'}

TypeError: unhashable type: 'list'

딕셔너리 관련 함수들

Key 리스트 만들기(keys)

In [22]:
a = {'name': 'pey', 'phone': '0119993323', 'birth': '1118'}

a.keys()
Out[22]:
dict_keys(['name', 'phone', 'birth'])
In [23]:
# 다음과 같이 리스트처럼 사용할 수 있으나, 리스트 고유의 함수인 append, insert, pop, remove, sort 등은 사용할 수 없다.

for k in a.keys():
    print(k)
name
phone
birth
In [24]:
# dict_keys 객체를 리스트로 변환

list(a.keys())
Out[24]:
['name', 'phone', 'birth']

Value 리스트 만들기(values)

In [25]:
a.values()
Out[25]:
dict_values(['pey', '0119993323', '1118'])
In [26]:
# Key, Value 쌍 얻기(items)

a.items()
Out[26]:
dict_items([('name', 'pey'), ('phone', '0119993323'), ('birth', '1118')])
In [27]:
# Key, Value 쌍 모두 지우기(clear)

a.clear()

a
Out[27]:
{}
In [28]:
# Key 로 Value 얻기(get)

a = {'name': 'pey', 'phone': '0119993323', 'birth': '1118'}

a.get('name')
Out[28]:
'pey'
In [29]:
a.get('phone')
Out[29]:
'0119993323'
In [30]:
# 찾으려는 key 값이 없을 경우 디폴트 값 반환

a.get('foo', 'bar')
Out[30]:
'bar'
In [31]:
# 해당 Key 가 딕셔너리 안에 있는지 조사하기(in)

'name' in a
Out[31]:
True
In [32]:
'email' in a
Out[32]:
False

02-6 집합 자료형

집합 자료형은 어떻게 만들까?

  • set 키워드를 사용, 리스트나 문자열을 입력
In [1]:
s1 = set([1, 2, 3])

s1
Out[1]:
{1, 2, 3}
In [2]:
s2 = set("Hello")

s2
Out[2]:
{'H', 'e', 'l', 'o'}

집합 자료형의 특징

  • 중복을 허용하지 않는다. -> 중복을 제거하기 위한 필터 역할로 종종 사용한다.
  • 순서가 없다(unordered)
In [3]:
s1 = set([1, 2, 3])
l1 = list(s1)
l1
Out[3]:
[1, 2, 3]
In [4]:
l1[0]
Out[4]:
1
In [5]:
t1 = tuple(s1)
t1
Out[5]:
(1, 2, 3)
In [6]:
t1[0]
Out[6]:
1

집합 자료형을 활용하는 방법

교집합, 합집합, 차집합 구하기

In [7]:
s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
In [8]:
# 교집합

s1 & s2
Out[8]:
{4, 5, 6}
In [9]:
s1.intersection(s2)
Out[9]:
{4, 5, 6}
In [10]:
# 합집합

s1 | s2
Out[10]:
{1, 2, 3, 4, 5, 6, 7, 8, 9}
In [11]:
s1.union(s2)
Out[11]:
{1, 2, 3, 4, 5, 6, 7, 8, 9}
In [12]:
# 차집합

s1 - s2
Out[12]:
{1, 2, 3}
In [13]:
s2 - s1
Out[13]:
{7, 8, 9}
In [14]:
s1.difference(s2)
Out[14]:
{1, 2, 3}
In [16]:
s2.difference(s1)
Out[16]:
{7, 8, 9}

집합 자료형 관련 함수들

In [18]:
# 값 1개 추가하기(add)

s1 = set([1, 2, 3])
s1.add(4)

s1
Out[18]:
{1, 2, 3, 4}
In [19]:
# 값 여러 개 추가하기(update)

s1 = set([1, 2, 3])
s1.update([4, 5, 6])

s1
Out[19]:
{1, 2, 3, 4, 5, 6}
In [20]:
# 특정 값 제거하기(remove)

s1 = set([1, 2, 3])
s1.remove(2)

s1
Out[20]:
{1, 3}

02-7 자료형의 참과 거짓

  • 자료형의 참과 거짓을 구분하는 기준은 다음과 같다.
참 or 거짓
"python"
"" 거짓
[1, 2, 3]
[] 거짓
() 거짓
{} 거짓
1
0 거짓
None 거짓
In [22]:
a = [1, 2, 3, 4]

while a:
    print(a.pop())
4
3
2
1

02-8 자료형의 값을 저장하는 공간, 변수

  • 아래 예에서 a, b, c를 변수라고 한다.
  • = (assignment, 할당) 기호를 사용한다.
  • C 언어나 JAVA처럼 자료형을 같이 쓸 필요가 없다.

변수명 = 변수에 저장할 값

>>> a = 1
>>> b = "python"
>>> c = [1, 2, 3]

변수란?

>>> a = 3
  • 위의 코드가 실행되면 3이라는 값을 가지는 정수 자료형(객체)가 자동으로 메모리에 생성된다.
  • a라는 변수는 그 정수형 객체가 저장된 메모리의 위치를 가리키게 된다.
  • 변수 a는 3이라는 정수형 객체를 가리키는 레퍼런스(Reference)라고도 할 수 있다.

[파이썬에서 "3"은 상수가 아닌 정수형 객체이다]

In [1]:
type(3)
Out[1]:
int
  • 아래 코드에서는 변수 a와 b가 모두 3이라는 정수형 객체를 가리키게 된다.
  • 동일한 객체를 가리키고 있는지 여부를 판단하는 내장함수 is 함수로 확인한다.
In [2]:
a = 3
b = 3

a is b
Out[2]:
True

[a, b, c]는 정말 같은 객체를 가리키는 걸까?]

  • 입력한 자료형에 대한 참조 개수(Reference Count)를 알려주는 sys.getrefcount 함수가 있다.
In [4]:
import sys

sys.getrefcount(3) # 파이썬 내부적으로 이미 사용되고 있다.
Out[4]:
650
In [12]:
var1 = 3
sys.getrefcount(3)
Out[12]:
731
In [13]:
var2 = 3
sys.getrefcount(3)
Out[13]:
732
In [14]:
var3 = 3
sys.getrefcount(3)
Out[14]:
733

변수를 만드는 여러가지 방법

>>> a, b = ('python', 'life') # 튜플로 값을 대입
>>> (a, b) = 'python', 'life' # 위 예문과 동일
>>> [a, b] = ['python', 'life'] # 리스트로
>>> a = b = 'python' # 여러 개의 변수에 같은 값을 대입
In [1]:
# 위의 방법을 이용하여 두 변수의 값 바꾸기

a = 3
b = 5
a, b = b, a

print(a)
print(b)
5
3

메모리에 생성된 변수 없애기

  • 생성된 정수형 객체를 없애려면 그 객체를 가키는 모든 변수를 삭제해야 한다.
  • 즉, 그 정수형 객체에 대한 참조개수가 0 이 되어야 한다.
  • Garbage collection(가비지 콜렉션)이라고도 한다.
In [2]:
a = 3
b = 3

del(a)
del(b)

리스트를 변수에 넣고 복사하고자 할 때

  • 아래 예에서 a = b 를 실행하면 리스트가 복사되는 것이 아니라 같은 리스트를 가리키는 변수가 되는 것이다.
In [3]:
a = [1, 2, 3]
b = a
a[1] = 4
a
Out[3]:
[1, 4, 3]
In [4]:
b
Out[4]:
[1, 4, 3]
  • 실제 복사하여 다른 리스트를 생성하는 방법은 다음의 2가지가 있다.

1. [ : ] 이용

In [5]:
a = [1, 2, 3]
b = a[:]
a[1] = 4

a
Out[5]:
[1, 4, 3]
In [6]:
b
Out[6]:
[1, 2, 3]

2. copy 모듈 이용

In [7]:
from copy import copy

b = copy(a)

b is a
Out[7]:
False