0%

[Python] python list와 tuple차이, 파이썬 리스트와 튜플차이

이미지
[Python] python list와 tuple차이, 파이썬 리스트와 튜플차이

파이썬 리스트, python list

파이썬 리스트는 대괄호([,])를 사용하여 여러 데이터들을 묶어놓은 집합입니다.
아래는 리스트 데이터의 정의, 인덱싱 및 슬라이싱을 보여주는 예제 입니다.

1
2
3
4
5
6
7
8
9
10
t = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']
>>> t
['foo', 'bar', 'baz', 'qux', 'quux', 'corge']

>>> t[0]
'foo'
>>> t[-1]
'corge'
>>> t[1::2]
['bar', 'qux', 'corge']

파이썬 튜플, python tuple

파이썬 튜플은 괄호((,))를 사용하여 여러 데이터들을 묶어놓은 집합입니다.
아래는 튜플 데이터의 정의, 인덱싱 및 슬라이싱을 보여주는 예제 입니다.

1
2
3
4
5
6
7
8
9
10
t = ('foo', 'bar', 'baz', 'qux', 'quux', 'corge')
>>> t
('foo', 'bar', 'baz', 'qux', 'quux', 'corge')

>>> t[0]
'foo'
>>> t[-1]
'corge'
>>> t[1::2]
('bar', 'qux', 'corge')

python list와 tuple 공통점, 파이썬 리스트와 튜플 공통점

먼저, 리스트와 튜플은 각 요소들에 대해 순서를 가집니다.
리스트나 튜플의 요소들을 순서대로 배치하지 않으면, 비교(==)시 서로 다른것으로 비교됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
a = ['foo', 'bar', 'baz', 'qux']
b = ['baz', 'qux', 'bar', 'foo']
print(a == b) # false

c = ('foo', 'bar', 'baz', 'qux')
d = ('baz', 'qux', 'bar', 'foo')
print(c == d) # false

a = ['foo', 'bar', 'baz', 'qux']
b = ['foo', 'bar', 'baz', 'qux']
print(a == b) # true

a = ['foo', 'bar', 'baz', 'qux']
c = ('foo', 'bar', 'baz', 'qux')
print(a == c) # false

또 다른 공통점으로는 한 리스트나 튜플에 여러 자료형을 넣을 수 있습니다.
예를 들어, 아래와 같이 문자와 실수, 정수, 불린값등을 같이 넣을 수 있습니다.

1
2
3
# 아래와 같이 선언 가능합니다
a = [21.42, 'foobar', 3, 4, 'bark', False, 3.14159]
b = (21.42, 'foobar', 3, 4, 'bark', False, 3.14159)

python list와 tuple 차이점, 파이썬 리스트와 튜플 차이점

앞서 본 내용상으로, 리스트와 튜플은 대괄호를 사용하느냐, 괄호를 사용하느냐의 차이만 있어보입니다.
하지만, 다른점이 몇가지 있습니다.

  1. mutable, immutable
    가장 큰 차이점은 리스트는 요소의 값을 바꿀 수 있으나, 튜플은 변경불가합니다.
    이를 변경가능하다를 mutable, 변경불가하다를 immutable이라고 표현하기도 합니다.
    예를 들어, 아래와 코드와 같이 a[0]의 값을 10으로 할당이 가능하나,
    튜플의 요소인 b[0]의 값을 10으로 할당을 하려고 하면 에러가 발생합니다.

    1
    2
    3
    4
    5
    a = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']
    b = ('foo', 'bar', 'baz', 'qux', 'quux', 'corge')

    a[0] = 10
    b[0] = 10 #TypeError: 'tuple' object does not support item assignment
  2. 사용가능한 메소드

  • list에서는 아래와 같은 메소드를 사용할 수 있습니다.
    • append() 리스트 끝에 요소 추가 Adds an element at the end of the list
    • clear() 모든 요소를 제거 Removes all the elements from the list
    • copy() 리스트를 복사 Returns a copy of the list
    • count() 리스트 요소의 갯수를 리턴 Returns the number of elements with the specified value
    • extend() 다른 리스트들의 요소들을 추가 Add the elements of a list (or any iterable), to the end of the current list
    • index() 특정 값이 나오는 첫번재 요소의 인덱스 리턴 Returns the index of the first element with the specified value
    • insert() 특정 위치에 요소 추가 Adds an element at the specified position
    • pop() 특정 위치의 요소를 제거  Removes the element at the specified position
    • remove() 특정값이 나오는 첫번째 아이템을 제거 Removes the first item with the specified value
    • reverse() 리스트를 역순으로 정렬 Reverses the order of the list
    • sort() 리스트를 정렬 Sorts the list
  • 그러나, tuple에서는 아래와 같은 메소드만 사용가능합니다.
    • count() 튜플 요소의 갯수를 리턴 Returns the number of times a specified value occurs in a tuple
    • index() 특정 값이 나오는 첫번재 요소의 인덱스 리턴 Searches the tuple for a specified value and returns the position of where it was found

예를 들어, 아래 코드는 a에 ‘test’ 요소가 추가가 됩니다.

1
2
a = ['foo', 'bar']
a.append('test')

하지만 아래 코드(튜플)는 에러를 발생시킵니다.

1
2
b = ('foo', 'bar')
b.append('test') # AttributeError: 'tuple' object has no attribute 'append'
  1. list에서의 over allocation
    리스트에서는 실제 데이터의 크기보다 더 큰 메모리를 할당받습니다.
    튜플은 요소 수가 변하지 않기에 메모리 크기를 fix할 수 있는데 반해,
    list는 요소 수가 얼마든지 변할 수 있습니다.
    list의 요소 수가 증가할 때마다 메모리를 할당받게 되면 속도저하가 많이 일어날 수 있기에
    미리 메모리 크기를 더 할당하게 됩니다.
    아래 예제 코드는 리스트와 튜플의 메모리 크기를 확인하는 코드입니다.
    기본적으로 빈 리스트와 튜플은 각각 56, 40 byte씩 차지하며, 한 요소당 필요한 메모리는 8byte입니다.
    요소수가 4개일 때, 리스트는 56 + 48 = 88보다 훨씬 큰 120byte의 크기를 할당받은것을 확인할 수 있고,
    튜플은 40 + 4
    8 = 72 딱 크기에 맞게 메모리 할당된 것을 확인을 할 수 있습니다.
    또한, 리스트의 경우, 요소수가 하나 더 증가하더라도 120으로 유지되는것을 볼 수 있습니다.
    미리 할당하여, 나중에 요소가 추가될 때 메모리 할당에 대한 시간소요를 적도록 하였습니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from sys import getsizeof

    l = []
    t = tuple()
    print(getsizeof(l)) #56
    print(getsizeof(t)) #40


    l = [1,2,3,4]
    t = (1,2,3,4)

    print(getsizeof(l)) #120
    print(getsizeof(t)) #72

    l = [1,2,3,4,5]
    t = (1,2,3,4,5)

    print(getsizeof(l)) #120
    print(getsizeof(t)) #80

총평

대부분의 예제 코드나, 실제 개발할때는 tuple을 잘 안쓰는것 같습니다.
튜플의 가장 큰 특징이 immutable과 메모리를 적게 차지한다가 될 수 있는데,
python은 데이터 분석하는데 많이 쓰이기 때문에 수시로 데이터가 많이 추가/제거 될수 있고,
얼마나 데이터가 추가될지 예상할 수 없기 때문이기에 tuple을 잘 사용하지 않는가 싶습니다.
메모리에 대한 문제는 요즘에는 서버든 개인pc든 충분히 큰 메모리를 사용할 수 있기에 신경쓰지 않는것은 아닐까 싶습니다.
만일 메모리를 비롯한 성능이 정말 중요하다면 python 보다는 c, c++같은 저수준의 언어를 써서 더 최적화를 하는게 좋은 선택이 될 수 있지 않을까 합니다.

[Python] python list와 tuple차이, 파이썬 리스트와 튜플차이
#파이썬,#python,#리스트,#튜플,#list,#tuple