문제

차이점이 뭐야?

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

도움이 되었습니까?

해결책

튜플이 불변이라는 것 외에도 사용법을 안내해야 하는 의미론적 구별도 있습니다.튜플은 이종 데이터 구조(즉, 해당 항목의 의미가 다름)인 반면 목록은 동종 시퀀스입니다. 튜플에는 구조가 있고 목록에는 순서가 있습니다.

이러한 구별을 사용하면 코드가 더 명확하고 이해하기 쉬워집니다.

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

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

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

예를 들어 페이지의 줄을 반복하는 경우와 같이 기존 위치 튜플 내의 항목을 변경하려는 상황이 있을 수 있습니다.그러나 튜플 불변성으로 인해 새 값마다 새 위치 튜플을 만들어야 합니다.언뜻 보기에는 불편해 보이지만 이와 같은 불변 데이터를 사용하는 것은 값 유형과 함수형 프로그래밍 기술의 초석이며 상당한 이점을 가질 수 있습니다.

이 문제에 관한 흥미로운 기사가 ​​있습니다. "파이썬 튜플은 단순한 상수 목록이 아닙니다" 또는 "튜플과 튜플의 이해Python의 목록".공식 Python 문서 또 이것을 언급한다

"튜플은 불변이며 일반적으로 이종 시퀀스를 포함합니다 ...".

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

마지막으로 명명된튜플 Python에서는 튜플이 이미 구조를 가지고 있다고 가정하기 때문에 이는 의미가 있습니다.이는 튜플이 클래스와 인스턴스에 대한 경량 대안이라는 아이디어를 강조합니다.

다른 팁

목록과 튜플의 차이

  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
    
  5. 해시 가능튜플은 해시 가능하지만 목록은 그렇지 않습니다. 해시 함수 객체가있는 경우 해시 값을 반환합니다.

    Hashability of list and tuple.

산책하러 가면 어떤 순간에 좌표를 기록 할 수 있습니다. (x,y) 튜플.

여행을 기록하고 싶다면 몇 초마다 목록에 위치 할 수 있습니다.

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

주요 차이점은 튜플이 불변하다는 것입니다. 이것은 당신이 그것을 만든 후에 튜플의 값을 변경할 수 없다는 것을 의미합니다.

따라서 값을 변경 해야하는 경우 목록을 사용하십시오.

튜플에 대한 이점 :

  1. 약간의 성능 향상.
  2. 튜플은 불변이기 때문에 사전에서 열쇠로 사용할 수 있습니다.
  3. 당신이 그것을 바꿀 수 없다면 다른 사람도 할 수 없습니다. 즉, API 기능 등에 대해 걱정할 필요가 없습니다.

목록은 변이 가능합니다. 튜플이 아닙니다.

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

튜플은 불변이며 일반적으로 포장 풀기 (이 섹션의 뒷부어 참조) 또는 인덱싱 (또는 명명 된 tuples의 경우 속성)을 통해 액세스하는 이질적인 요소를 포함합니다. 목록은 변이 가능하며, 그 요소는 일반적으로 균질하며 목록을 반복하여 액세스합니다.

이것의 언급되었습니다 차이는 크게 의미 적입니다. 사람들은 튜플과 목록이 다른 정보를 나타낼 것으로 기대합니다. 그러나 이것은 가이드 라인보다 더 나아갑니다. 일부 라이브러리는 실제로 통과 된 내용에 따라 다르게 행동합니다. 예를 들어 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가 표준 라이브러리의 일부가 아닐 수도 있지만 주요한 파이썬 라이브러리와 Numpy 목록과 튜플 내에서 완전히 다른 것들이 있습니다.

목록은 루핑을위한 것입니다. 튜플은 구조를위한 것입니다. "%s %s" %tuple.

목록은 일반적으로 균질하며 튜플은 일반적으로 이질적입니다.

목록은 가변 길이, 튜플은 고정 길이입니다.

이것은 파이썬 목록의 예입니다.

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

이것은 파이썬 튜플의 예입니다.

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

파이썬 목록과 튜플은 둘 다 값 수집을 주문한다는 점에서 비슷합니다. 괄호 [..., ...]및 괄호를 사용하는 튜플 "(..., ...)", 핵심 기술 "Python Syntax에서 하드 코딩 된"차이를 사용하여 목록이 생성되는 얕은 차이 외에 특정 튜플의 요소는 불변이지만 목록은 변하지 않습니다 (... 튜플 만 해시 가능하고 사전/해시 키로 사용될 수 있습니다!). 이것은 그들이 사용할 수있는 방법 (구문에 의해 선험적으로 시행 될 수있는 방법)과 사람들이 그것들을 사용하기로 선택하는 방법의 차이 ( '모범 사례', 후방, 이것이 무엇입니까? 똑똑한 프로그래머는). 튜플을 사용할 때 차별화 할 때 후방의 주요 차이점과 목록이 사용될 때 의미 사람들은 요소의 순서를 준다.

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

목록의 경우 'Order'는 시퀀스 또는 방향성을 나타냅니다. 두 번째 요소 이후에 와야합니다 첫 번째 요소는 특정 및 공통 척도 또는 치수를 기준으로 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. 통사론 - 사용 [], 튜플 use () 목록

  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")).

의 값 목록 값이지만 언제든지 변경할 수 있습니다 튜플 변경할 수 없습니다.

그만큼 장점과 단점 사용에 따라 다릅니다. 변경하고 싶지 않은 데이터가 있으면 튜플을 사용해야합니다. 그렇지 않으면 목록이 가장 좋은 옵션입니다.

목록은 균질 한 서열이며, 튜플은 이종 데이터 구조입니다.

목록과 튜플의 차이

튜플과 목록은 모두 파이썬에서 유사한 시퀀스 유형입니다.

  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. 의미론

    이 시점은 모범 사례에 관한 것입니다. 튜플을 이기종 데이터 구조로 사용하고 목록은 균질 한 시퀀스입니다.

사람들이 이미 여기에서 대답했습니다 tuples 불변입니다 lists 변이 가능하지만 우리가 기억해야 할 튜플을 사용하는 데있어 중요한 측면이 하나 있습니다.

만약 tuple a list 또는 a 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 예외 없이도 불변으로 남아 있습니다

그만큼 PEP 484- 유형 힌트 a의 요소 유형이라고 말합니다 tuple 개별적으로 입력 할 수 있습니다. 당신이 말할 수 있도록 Tuple[str, int, float]; 그러나 a list, 와 함께 List 입력 클래스는 하나의 유형 매개 변수 만 가져갈 수 있습니다. List[str], 이것은 2의 차이가 실제로 전자가 이질적이지만 후자는 본질적으로 균질하다는 것을 암시한다.

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

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

튜플은 목록과 비슷해 보일 수 있지만 종종 다른 상황과 다른 목적으로 사용됩니다. 튜플이 있습니다 불변, 일반적으로 a 이기종 서열 액세스하는 요소의 포장 풀기 (이 섹션의 뒷부분 참조) 또는 인덱싱 (또는 명명 된 tuples의 경우 속성에 의해서도). 목록이 있습니다 변하기 쉬운, 그리고 그들의 요소는 보통입니다 동종의 그리고 접근합니다 반복 목록 위에.

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

  • 튜플, 주문한 요소 시퀀스 (별명 문제가없는 객체를 포함 할 수 있음)
    • 불변 (튜플, 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] (읽을 수 없음)

목록을 사용하면 별명 버그 (동일한 객체를 가리키는 두 개의 별개의 경로)가 발생할 수 있습니다.

목록은 변이 가능하며 튜플은 불변입니다. 이 예를 고려하십시오.

a = ["1", "2", "ra", "sa"]    #list
b = ("1", "2", "ra", "sa")    #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.

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

목록은 변이 가능하며 튜플은 불변입니다. 돌연변이와 불변의 주요 차이점은 항목을 추가하려고 할 때 메모리 사용법입니다.

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

그러나 새로운 요소를 자주 추가하지 않는다는 것을 알고 있다면 튜플을 사용해야합니다. 튜플은 필요한 메모리의 정확한 크기를 할당하므로 특히 큰 메모리 블록을 사용할 때 메모리를 저장합니다.

내가 찾은 기본 차이점은 튜플이 불변으로 목록이 변하지 않는다는 것입니다. 튜플은 변경할 필요가없는 계산에 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top