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


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.