리스트와 튜플의 차이점은 무엇입니까?


1020

차이점이 뭐야?

튜플 /리스트의 장단점은 무엇입니까?


13
다른 사람들은 아래에 대답했지만, 파이썬에는 완전히 직관적이지 않은 데이터 형식 이름이 있습니다. 다른 언어에는 튜플 (그 이름으로)이 있다고 생각하지 않으며 언어로 번역 할 수없는 단어로 더 나쁜 것이 있습니다. "튜플"이 어디에서 오는지 아는 사람 있습니까? 네덜란드어?
— Rook

98
튜플은 라틴어에서 파생 된 수학의 기본 용어입니다 (wikipedia 참조).
— nikow

129
pair-> triple-> quadruple-> quintuple-> sextuple-> 음, 그게 뭐라 불리는가? 7-tuple-> 8-tuple-> ... 따라서 일반적인 이름으로 'tuple'.
— John Fouhy

31
@JohnFouhy 6 년이 지난 지금, ... : heptuple, octuple, 9 개의 요소가있는 튜플, decuple, undecuple, dodecuple ... : D
— Augusta

18
@MegaWidget 나는 우리가 nontuple 이임을 알 것이라고 생각했습니다 list. ; D
— Augusta

답변:


1017

튜플은 불변이지만, 사용법을 안내하는 의미 론적 차이도 있습니다. 튜플은 이기종 데이터 구조 (즉, 항목의 의미가 다름)이며 목록은 동종 시퀀스입니다. 튜플은 구조를 가지며 목록은 순서를 갖습니다.

이 구별을 사용하면 코드를보다 명확하고 이해할 수 있습니다.

한 가지 예는 책에서 위치를 참조하기위한 페이지와 줄 번호의 쌍입니다. 예 :

my_location = (42, 11)  # page number, line number

그런 다음이를 사전의 키로 사용하여 위치에 메모를 저장할 수 있습니다. 반면에 목록은 여러 위치를 저장하는 데 사용될 수 있습니다. 당연히 목록에서 위치를 추가하거나 제거하고 싶을 수 있으므로 목록을 변경할 수 있습니다. 반면에 기존 위치에서 항목을 추가하거나 제거하는 것은 의미가 없으므로 튜플은 변경할 수 없습니다.

예를 들어 페이지 라인을 반복 할 때 기존 위치 튜플 내에서 항목을 변경하려는 상황이있을 수 있습니다. 그러나 튜플 불변성은 각 새 값에 대해 새 위치 튜플을 작성하도록합니다. 이것은 그 자체로는 불편한 것처럼 보이지만 이와 같은 불변의 데이터를 사용하는 것은 가치 유형과 기능적 프로그래밍 기술의 초석이며 상당한 이점을 가질 수 있습니다.

이 문제에 대한 몇 가지 흥미로운 기사가 ​​있습니다. 예를 들어 "Python 튜플은 상수 목록이 아닙니다" 또는 "Python의 튜플 vs. 목록 이해"등이 있습니다. 공식 파이썬 문서 에도 언급 되어 있습니다

"Tuples는 불변이며 일반적으로 이기종 시퀀스를 포함합니다 ...".

Haskell 과 같은 정적으로 유형이 지정된 언어 에서 튜플의 값은 일반적으로 다른 유형을 가지며 튜플의 길이는 고정되어야합니다. 목록에서 값은 모두 같은 유형이며 길이는 고정되어 있지 않습니다. 따라서 그 차이는 매우 분명합니다.

마지막으로 파이썬 에는 namedtuple 이 있는데, tuple은 이미 구조를 가지고 있기 때문에 의미가 있습니다. 이것은 튜플이 클래스와 인스턴스에 대한 경량 대안이라는 아이디어를 강조합니다.


11
+1, 특히 훌륭한 예가있는 두 번째 링크의 경우. 이 튜플은 가벼운 레코드 나 구조체로 작동합니다.
— Baltimark

105
"목록은 동종 시퀀스입니다"-저는 Python을 처음 사용하지만 이종 목록이 없습니까? 에서 docs.python.org/py3k/tutorial/introduction.html : "목록의 항목은 모두 같은 유형이 필요가 없습니다." 그러나 공식적인 개념에 대해 말하고 있지만 파이썬은 그것을 받아들이지 않습니다.
— Matthew Cornell

13
"tuple"에 대한 의미 론적 동의어는 "record"일 수 있습니다. 특정 순서로 관련 데이터 항목의 모음입니다. 사실 나는 collections.namedtuple더 잘 부를 것 같은 느낌이 든다 collections.record. 예를 들어 고객 레코드에서 이름과 주소를 바꾸는 것은 의미가 없습니다. 실제로, 그렇게하는 것은 일반적으로 튜플의 불변성이 커밋을 방해하는 오류 일 것입니다.
— kindall

4
@ nikow :에 관해서 What would you do with such a list?는 ppl이 판타지 부족을 인수로 사용할 때 항상 떨립니다 . 혼합 유형 목록을 사용하면 각 계층 구조가 하위 목록과 값 요소로 구성된 일부 계층 적 데이터 구조에 적합합니다.
— Sebastian Mach

18
튜플이 이기종이고 목록이 동종이라고 말하는 것이 오도되지 않습니까? 예를 들어,리스트는 다른 데이터 타입, 즉 l = [1, 2, 'a']의 혼합을 가질 수 있습니다. 나는 당신이 무슨 말을하는지 이해하지 못합니다.
— Celeritas

362

리스트와 튜플의 차이점

  1. 오자

    someTuple = (1,2)
    someList  = [1,2] 
    
  2. 크기

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088
    

    튜플 연산의 크기가 작기 때문에 조금 더 빠르지 만 많은 요소가있을 때까지 언급하지는 않습니다.

  3. 허용 된 작업

    b    = [1,2]   
    b[0] = 3       # [3, 2]
    
    a    = (1,2)
    a[0] = 3       # Error
    

    또한 요소를 삭제하거나 튜플을 정렬 할 수 없음을 의미합니다. 그러나 튜플을 변경할 수 없기 때문에 실제로 요소를 추가하는 것이 아니라 새 튜플을 만들고 있으므로 ID가 변경 된다는 유일한 차이점으로 목록과 튜플 모두에 새 요소를 추가 할 수 있습니다

    a     = (1,2)
    b     = [1,2]  
    
    id(a)          # 140230916716520
    id(b)          # 748527696
    
    a   += (3,)    # (1, 2, 3)
    b   += [3]     # [1, 2, 3]
    
    id(a)          # 140230916878160
    id(b)          # 748527696
    
  4. 용법

    리스트는 변경 가능하기 때문에 튜플을 사용할 수있는 반면 사전에서는 키로 사용할 수 없습니다.

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error
    

목록 크기를 큰 값으로 조정하려고하면 어떻게됩니까? 메모리 주소가 변경됩니까 (ID를 변경해야한다고 생각합니다). 아니면 오류가 발생합니까?
— WanderingMind

17
@WanderingMind : 목록 값이 저장된 메모리 주소는 목록 개체 자체가 저장된 메모리 주소와 다릅니다.
— Tom

2
흠 ...이 게시물 의 첫 번째 상자를 제외한 모든 코드 3. Permitted operation는 튜플 케이스를 먼저 보여줍니다. 나는 성공과 오류를 보여주는 것이 일반적이라는 것을 알고 있지만 잠시 동안 내 머리를 어지럽 혔다.
— dmckee --- 전 운영자 고양이

1
포인트 3 아래에 표시된 것처럼 단일 요소 목록은 일 수 one_item_list = [a]있지만 one_tuple = (a,)해당 튜플입니다. 변수 이름 뒤에 쉼표를 적어 둡니다. 또한 참고하십시오 two_tuple = (a, b). 이것은 나를 두 번 이상 던졌습니다 (여전히 Python 3에는 있습니다).
— mjkrause

1
@Cheng 튜플을 정렬하면 튜플이 변경되므로 해당 항목이 변경됩니다. 튜플은이를 지원하지 않습니다. 파이썬에서 정렬 된 튜플을 얻는 가장 간단한 방법은tuple(sorted(the_unsorted_tuple))
— ApproachingDarknessFish

204

산책을 갔다면 (x,y)튜플 에서 언제든지 좌표를 확인할 수 있습니다 .

여행을 기록하려면 몇 초마다 위치를 목록에 추가 할 수 있습니다.

그러나 당신은 다른 방법으로 그것을 할 수 없었습니다.


37
이 예제는 단지 규칙처럼 보입니다. 사람들은 "필요하다면 좌표를 기록하기 위해 여전히 [x, y]를 사용할 수 있습니다"라고 주장 할 수 있습니다. 따라서이 답변은 한 문장이 더 이상없는 한 완료되지 않은 것으로 간주됩니다. "좌표를 저장하기 위해리스트를 사용하지 말아야하는 이유에 대한 @nikow의 게시물 읽기"
— RayLuo

71
@ Iceberg, 내 대답은 직관을 개발하는 데 도움이됩니다. 주제의 모든 뉘앙스를 탐구하는 것은 아닙니다.
— dan-gph

8
좋은 예 +1. 튜플 요소 (여기서는 좌표)의 보완적인 특성을 강조합니다. 튜플 전체 중 하나의 의미 (여기에서는 한 지점의 위치)가 변경되기 때문에 튜플 요소 (여기서는 좌표)의 수정이 허용되지 않는 이유입니다.
— Hao Wang

77

주요 차이점은 튜플은 변경 불가능하다는 것입니다. 즉, 튜플을 만든 후에는 값을 변경할 수 없습니다.

따라서 값을 변경해야 할 경우 List를 사용하십시오.

튜플의 이점 :

  1. 약간의 성능 향상.
  2. 튜플은 변경할 수 없으므로 사전에서 키로 사용할 수 있습니다.
  3. 변경할 수 없다면 다른 사람도 할 수 없습니다. 다시 말해 API 함수에 대해 걱정할 필요가 없습니다.

14
튜플은 모든 요소가 인 경우 에만 변경할 수 없습니다 . frozenset다양한 제 3 자 고정 dict / tree / etc 와 같은 모든 불변 컬렉션에 대해서도 마찬가지입니다 . 유형이 있지만 변경 가능한 요소를 추가 할 수있는 것은 없습니다. (물론 튜플은 모든 요소가 있으므로, 일반적인 EAFP 방식의 핸들 인 경우에만 해쉬입니다 d[1, [2]]올릴 것이다 TypeError: unhashable type: 'list'.)
— abarnert

1
튜플은 모든 요소가 변경 불가능한 경우에만 사전에서 키로 사용될 수 있습니다. 여기를
— Will Dereham

31

리스트는 변경 가능합니다. 튜플은 없습니다.

에서 docs.python.org/2/tutorial/datastructures.html

튜플은 변경할 수 없으며 일반적으로 압축 풀기 (이 섹션의 뒷부분 참조) 또는 인덱싱 (또는 명명 된 튜플의 경우 속성 별)을 통해 액세스되는 이기종 시퀀스의 요소를 포함합니다. 목록은 변경 가능하며 해당 요소는 일반적으로 동종이며 목록을 반복하여 액세스합니다.


1
나는 정말로 의미 론적 의미를 고려해야한다고 생각합니다 (아래 내 대답 참조).
— nikow

지금은 노력할만한 가치가 없지만, 감사합니다.
— duffymo

6 개월 후, 이것이 당신이 기여할 수있는 전부입니까? 나는 원래 답변과 다른 사람들이 의견을 나누는 것보다 4 시간이 지났기 때문에 그 대답을했습니다. 대답이 틀렸습니까? Nikow에 의해 개선되었지만 실제로는 아닙니다. 그렇다면 링크가 실제로 무엇을 추가할까요?
— duffymo

4
여기의 다른 답변이 이와 같은 품질을 갖는 방법을 보는 것은 재밌지 만 "-1"이라고 언급 한 한 명의 의견 때문에이 답변 만 싫어합니다. 그리고 품질의 0.5 배에 불과하지만 다운 보트의 0.1 배에 불과한 또 다른 답변이 있습니다.
— Sebastian Mach

2
@ duffymo이 답변 이이 페이지에서 가장 명확하고 간결하다고 생각합니다. 그것은 튜플과 목록 사이의 유일한 중요한 차이점을 말하며이 끔찍한 거짓 균질 대 이질적인 호그 워시에 대해 끝없이 흔들리지 않습니다.
— 개미

20

그건 언급 차이가 크게 의미이다 : 사람들이 튜플 및 목록은 다른 정보를 나타내는 것으로 기대합니다. 그러나 이것은 지침보다 더 나아갑니다. 일부 라이브러리는 전달 된 내용에 따라 실제로 다르게 작동합니다. NumPy를 예로 들어 보겠습니다 ( 더 많은 예제를 요구하는 다른 게시물 에서 복사했습니다 ).

>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
       [3, 4, 5]])

요점은 NumPy가 표준 라이브러리의 일부는 아니지만 주요 Python 라이브러리이며 NumPy 목록과 튜플 내에서 완전히 다른 것입니다.


2
이것은 실제로 유용한 답변이 아닙니다. 차이점은에 type(a_list) != type(a_tuple)기초한 라이브러리 코드 분기 type(x)는 다르게 동작한다는 것입니다.
— Eric

1
좋은 지적, 나는 게시물을 편집했습니다 : 이것은 의미 론적 지침이 일부 라이브러리에 하드 코딩되어 있음을 실제로 지적하고 있습니다.
— Shep

1
타사 라이브러리보다 stdlib / builtins의 예제를 사용하는 것이 좋습니다. 단일 값 또는 튜플 값을 사용할 수있는 곳은 여러 곳이며 목록 또는 기타 시퀀스는 단일 값으로 간주됩니다. 예를 들어, '%d %d' % [2, 3]A는 TypeError처음에 목록을 전달하려고 노력하고 있기 때문에, %d당신은 두 번째에 어떤 값을 전달하지 않는 %d. (그러나, 이것에도 반대의 예가 있습니다 max...)
— abarnert

그것은 흥미 롭습니다. 파이썬 표준 라이브러리에 이것의 예가 있다는 것을 몰랐습니다. 당신이 말하는 곳이 많습니까?
— Shep

18

리스트는 루핑을위한 것이고 튜플은 구조를위한 것 "%s %s" %tuple입니다.

목록은 일반적으로 동종이고 튜플은 일반적으로 이종입니다.

리스트는 가변 길이, 튜플은 고정 길이입니다.


16

다음은 Python 목록의 예입니다.

my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]

다음은 Python 튜플의 예입니다.

my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")

파이썬리스트와 튜플은 둘 다 정렬 된 값 모음이라는 점에서 비슷합니다. 리스트가 대괄호 "[..., ...]"를 사용하여 생성 된 얕은 차이와 괄호 "(..., ...)"를 사용하여 튜플은 핵심 기술 "파이썬 구문으로 하드 코딩 된"차이 특정 튜플의 요소는 변경할 수 없지만 목록은 변경할 수 있습니다 (튜플 만 해시 가능하며 사전 / 해시 키로 사용할 수 있습니다!). 이것은 그들이 어떻게 사용할 수 있는지 또는 어떻게 사용할 수 없는지 (구문에 의해 우선 순위를 강화함)와 사람들이 그것들을 사용하도록 선택하는 방법의 차이를 야기합니다 ( '최고의 관행', 후유증, 이것이 스마트 프로그래머가하는 일입니다). 사람들은 요소의 순서를 제공합니다.

튜플의 경우 '순서'는 정보를 보유하기위한 특정 '구조'에 지나지 않습니다. 첫 번째 필드에서 찾은 값은 두 개의 다른 차원 또는 스케일에 걸쳐 값을 제공하므로 두 번째 필드로 쉽게 전환 할 수 있습니다. 그들은 다양한 유형의 질문에 대한 답변을 제공하며 일반적으로 주어진 객체 / 주제에 대해 그 속성은 무엇입니까? 객체 / 대상은 일정하게 유지되고 속성이 다릅니다.

목록에서 '순서'는 순서 또는 방향성을 나타냅니다. 두 번째 요소 는 첫 번째 요소 다음 에 와야 합니다. 첫 번째 요소는 특정 및 공통 스케일 또는 치수를 기준으로 2 위에 위치하기 때문입니다. 요소는 전체로 간주되며 주어진 속성에 대해 일반적으로 단일 질문에 대한 답변을 주어진 속성에 대해 어떻게 제공합니까? 속성은 일정하게 유지되며 객체 / 대상은 다릅니다.

대중 문화와 프로그래머에있어 이러한 차이를 따르지 않는 수많은 사례가 있으며, 메인 코스에 샐러드 포크를 사용할 수도 있습니다. 하루가 끝나면 괜찮아 둘 다 보통 일을 끝낼 수 있습니다.

더 자세한 내용을 요약하려면

유사점 :

  1. 중복 -튜플과리스트 모두 중복 가능
  2. 인덱싱, 선택 및 슬라이싱 -튜플과 괄호 안에있는 정수 값을 사용하여 인덱스를 나열합니다. 따라서 주어진 목록이나 튜플의 처음 3 개 값을 원하면 구문은 같습니다.

    >>> my_list[0:3]
    [0,1,2]
    >>> my_tuple[0:3]
    [a,b,c]
  3. 비교 및 정렬 -두 개의 튜플 또는 두 개의 목록은 첫 번째 요소를 기준으로 비교되며, 넥타이가 있으면 두 번째 요소 등을 기준으로 비교됩니다. 이전 요소에 차이가 나타난 후 후속 요소에 더 이상주의를 기울이지 않습니다.

    >>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
    True
    >>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
    True

차이점 : -사전 정의

  1. 구문 -목록 사용 [], 튜플 사용 ()

  2. 변경 가능성 -주어진 목록의 요소는 변경 가능하며, 주어진 튜플의 요소는 변경할 수 없습니다.

    # Lists are mutable:
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
    >>> top_rock_list[1]
    'Kashmir'
    >>> top_rock_list[1] = "Stairway to Heaven"
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
    
    # Tuples are NOT mutable:       
    >>> celebrity_tuple
    ('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
    >>> celebrity_tuple[5]
    'Dead'
    >>> celebrity_tuple[5]="Alive"
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
  3. 해시 테이블 (사전) -해시 테이블 (사전)에서는 키를 해시 할 수 있고 변경할 수 없어야하므로 튜플 만 목록이 아닌 사전 키 역할을 할 수 있습니다.

    #Lists CAN'T act as keys for hashtables(dictionaries)
    >>> my_dict = {[a,b,c]:"some value"}
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    
    #Tuples CAN act as keys for hashtables(dictionaries)
    >>> my_dict = {("John","Wayne"): 90210}
    >>> my_dict
    {('John', 'Wayne'): 90210}

차이점-사용중인 포스터 리 오리

  1. 요소의 동질성 대 이질성-일반적으로 목록 객체는 동종이고 튜플 객체는 이종입니다. 즉, 목록은 같은 유형의 객체 / 대상 (모든 대통령 후보, 모든 노래 또는 모든 주자 등)에 사용되는 반면, 튜플은 이기종 객체에 더 적합합니다.

  2. 루핑 대 구조-둘 다 루핑을 허용하지만 (my_list에서 x의 경우 ...) 목록에 대해 루핑하는 것이 합리적입니다. 튜플은 정보를 구성하고 제시하는 데 더 적합합니다 (% s에있는 % s % s은 (는) % s이고 현재 % s %입니다 ( "John", "Wayne", 90210, "Actor", "Dead")).


불변성의 이유를 설명하는 해시 테이블 / 해시 가능한 예제가 좋습니다. 터플 (레코드 / 구조체 / 좌표 / 벡터 / 점)을 복잡한 키로 사용할 수 있습니다.
— Dave X

9

list 의 값은 언제든지 변경할 수 있지만 튜플 의 값은 변경할 수 없습니다.

장점과 단점은 사용에 따라 달라집니다. 변경하고 싶지 않은 데이터가있는 경우 튜플을 사용해야하며 그렇지 않으면 list가 가장 좋습니다.


7

리스트와 튜플의 차이점

튜플과리스트는 파이썬에서 비슷한 시퀀스 유형으로 보입니다.

  1. 리터럴 구문

    괄호 ( )를 사용 하여 튜플과 대괄호 [ ]를 만들어 새 목록을 얻습니다. 또한 적절한 유형의 호출을 사용하여 필요한 구조 (튜플 또는 목록)를 얻을 수 있습니다.

    someTuple = (4,6)
    someList  = [2,6] 
  2. 돌연변이

    튜플은 변경할 수 없지만 목록은 변경할 수 있습니다. 이 점은 다음 사항의 기본입니다.

  3. 메모리 사용량

    변경 가능성으로 인해 목록에 더 많은 메모리가 필요하고 튜플에 더 적은 메모리가 필요합니다.

  4. 확장

    튜플의 ID가 변경된다는 차이점만으로 튜플과 목록에 새 요소를 추가 할 수 있습니다 (즉, 새 객체가 생성됨).

  5. 해싱

    튜플은 해시 가능하며 목록은 없습니다. 그것은 튜플을 사전의 키로 사용할 수 있음을 의미합니다. 리스트는 사전에서 키로 사용할 수 없지만 튜플은 사용할 수 있습니다

    tup      = (1,2)
    list_    = [1,2] 
    
    c = {tup   : 1}     # ok
    c = {list_ : 1}     # error
  6. 의미론

    이 시점은 모범 사례에 관한 것입니다. 튜플은 이기종 데이터 구조로 사용해야하지만 목록은 동종 시퀀스입니다.


1
확장과 해싱에 대한 명시 적 토론에 대한 투표로, 기존의 다른 답변에서는 눈에 띄지 않았습니다.
— dmckee --- 전 운영자 고양이

6

튜플은 이기종 데이터 구조 인 반면, 목록은 균질 한 시퀀스가되어야합니다.


26
이 시점에서이 답변은 다른 더 나은 답변이 많으므로 토론에 아무 것도 추가하지 않습니다.
— Jonathon Reinhart

5

사람들이 이미 여기에 대답 했지만 tuples불변이지만 변하지 않는 lists튜플 사용의 중요한 측면이 있습니다.

내부에 tuplea list또는 dictionary내부 가 포함 된 경우 tuple자체가 변경되지 않더라도 변경할 수 있습니다 .

예를 들어,리스트와 사전을 포함하는 튜플이 있다고 가정 해 봅시다.

my_tuple = (10,20,30,[40,50],{ 'a' : 10})

리스트의 내용을 다음과 같이 변경할 수 있습니다

my_tuple[3][0] = 400
my_tuple[3][1] = 500

새로운 튜플처럼 보이게

(10, 20, 30, [400, 500], {'a': 10})

튜플 내부의 사전을 다음과 같이 변경할 수도 있습니다.

my_tuple[4]['a'] = 500

전체 튜플처럼 보일 것입니다

(10, 20, 30, [400, 500], {'a': 500})

이 때문에 발생 list하고 dictionary있는 개체는 이러한 객체가 변경되지 않지만 내용의 포인팅한다.

따라서 tuple예외없이 불변 의 상태가 유지됩니다.


이 게시물은 "튜플 자체가 변경 불가능한 경우에도 변경 될 수 있습니다"라고 설명하면 개선 될 것 입니다. 그 객체는 자신의 정체성을 유지하기 때문입니다 (따라서 여전히 동일한 객체를 포함하기 때문에 튜플은 변경되지 않았습니다 ...).
— dmckee --- 전 운영자 고양이

3

PEP 484 - 유형 힌트 (A)의 요소의 종류가 있다고 tuple개별적으로 입력 할 수 있습니다; 말할 수 있도록 Tuple[str, int, float]; 그러나이 list함께 List입력 클래스 하나만 입력 파라미터를 취할 수있다 : List[str]상기 (2)의 차이점은 실제로 전자가 후자 반면 본질적 동종 이종 있다는 것을 암시한다.

또한 표준 라이브러리는 대부분 튜플을 C가 a를 반환하는 표준 함수의 반환 값으로 사용합니다 struct.


3

사람들이 이미 차이점을 언급했듯이 튜플 이유에 대해 쓸 것입니다.

튜플이 선호되는 이유는 무엇입니까?

작은 튜플에 대한 할당 최적화

파이썬은 메모리 조각화를 줄이고 할당 속도를 높이기 위해 오래된 튜플을 재사용합니다. 튜플이 더 이상 필요하지 않고 영구적으로 삭제하는 대신 항목이 20 개 미만인 경우 Python은 해당 항목을 사용 가능한 목록으로 이동합니다.

사용 가능한 목록은 20 개의 그룹으로 나누어지며, 각 그룹은 길이가 n과 20 사이의 튜플 목록을 나타냅니다. 각 그룹은 최대 2 000 개의 튜플을 저장할 수 있습니다. 첫 번째 (0) 그룹은 하나의 요소 만 포함하며 빈 튜플을 나타냅니다.

>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104

위의 예에서 a와 b의 ID가 동일하다는 것을 알 수 있습니다. 자유 목록에있는 파괴 된 튜플을 즉시 점유했기 때문입니다.

목록의 할당 최적화

리스트는 수정 될 수 있기 때문에 파이썬은 튜플에서와 같은 최적화를 사용하지 않습니다. 그러나 파이썬 목록에는 사용 가능한 목록이 있지만 빈 객체에만 사용됩니다. 빈 목록이 GC에 의해 삭제되거나 수집되면 나중에 재사용 할 수 있습니다.

>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792

출처 : https://rushter.com/blog/python-lists-and-tuples/

왜 튜플이리스트보다 효율적인가? -> https://stackoverflow.com/a/22140115


2

5.3 의 문서에서 방향 인용 . 튜플 및 시퀀스 :

튜플은 목록과 비슷해 보일 수 있지만 종종 다른 상황과 다른 목적으로 사용됩니다. 튜플은 변경할 수 없으며 일반적으로 압축 해제 (이 섹션의 뒷부분 참조) 또는 인덱싱 (또는 명명 된 튜플의 경우 속성 별 )을 통해 액세스 되는 이기종 시퀀스 의 요소를 포함합니다 . 목록은 변경 가능 하며 해당 요소는 일반적으로 동종 이며 목록 을 반복 하여 액세스 합니다.


1

우선, 둘 다 파이썬에서 비-스칼라 객체 (복합 객체라고도 함)입니다.

  • 튜플, 순서가 지정된 요소 (앨리어싱 문제가없는 객체를 포함 할 수 있음)
    • 불변 (tuple, int, float, str)
    • 연결을 사용하여 +(물론 새로운 튜플이 생성됩니다)
    • 인덱싱
    • 슬라이싱
    • (3,) # -> (3)대신 싱글 톤(3) # -> 3
  • 순서대로 정렬 된 값의 목록 (다른 언어로 된 배열)
    • 변하기 쉬운
    • 하나씩 일어나는 것 [3]
    • 클로닝 new_array = origin_array[:]
    • 목록 이해 [x**2 for x in range(1,7)]는 당신에게 제공합니다 [1,4,9,16,25,36](읽을 수 없음)

list를 사용하면 앨리어싱 버그 (같은 객체를 가리키는 두 개의 고유 한 경로)가 발생할 수도 있습니다.


0

리스트는 변경 가능하고 튜플은 변경 불가능합니다. 이 예제를 고려하십시오.

a = ["1", "2", "ra", "sa"]    #list
b = ("1", "2", "ra", "sa")    #tuple

이제 list와 tuple의 인덱스 값을 변경하십시오.

a[2] = 1000
print a     #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b     #output : TypeError: 'tuple' object does not support item assignment.

따라서 다음 코드는 튜플에 유효하지 않은 것으로 판명되었습니다. 튜플을 업데이트하려고 시도했지만 허용되지 않습니다.


-1

리스트는 변경 가능하고 튜플은 변경 불가능합니다. 변경 가능과 변경 불가능의 주요 차이점은 항목을 추가하려고 할 때 메모리 사용량입니다.

변수를 만들면 일부 고정 메모리가 변수에 할당됩니다. 목록 인 경우 실제로 사용 된 것보다 더 많은 메모리가 할당됩니다. 예를 들어 현재 메모리 할당이 100 바이트 인 경우 101 번째 바이트를 추가하려는 경우 다른 100 바이트가 할당 될 수 있습니다 (이 경우 총 200 바이트).

그러나 새 요소를 자주 추가하지 않는 경우 튜플을 사용해야합니다. 튜플은 필요한 메모리의 정확한 크기를 할당하므로 특히 큰 메모리 블록을 사용할 때 메모리를 절약합니다.


2
그중 일부는 기술적으로 사실이지만 실제로 변경 가능 유형과 변경 불가능한 유형의 중요한 차이점은 아닙니다. 더 큰 차이점은 변경 후 변경 가능한 유형은 변경할 수 있지만 변경 불가능한 유형은 변경할 수 없다는 것입니다.
— Roger Fan

1
그 이유도 아닙니다. 메모리와 변경 성은 서로 관련이 없습니다. 그것은 단순히 목록에 특정한 구현 세부 사항입니다. 메모리도 변수에 할당되지 않고 객체에 할당됩니다. 변수는 그런 객체에 대한 참조 일뿐입니다.
— Roger Fan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.