차이점이 뭐야?
튜플 /리스트의 장단점은 무엇입니까?
list
. ; D
차이점이 뭐야?
튜플 /리스트의 장단점은 무엇입니까?
list
. ; D
답변:
튜플은 불변이지만, 사용법을 안내하는 의미 론적 차이도 있습니다. 튜플은 이기종 데이터 구조 (즉, 항목의 의미가 다름)이며 목록은 동종 시퀀스입니다. 튜플은 구조를 가지며 목록은 순서를 갖습니다.
이 구별을 사용하면 코드를보다 명확하고 이해할 수 있습니다.
한 가지 예는 책에서 위치를 참조하기위한 페이지와 줄 번호의 쌍입니다. 예 :
my_location = (42, 11) # page number, line number
그런 다음이를 사전의 키로 사용하여 위치에 메모를 저장할 수 있습니다. 반면에 목록은 여러 위치를 저장하는 데 사용될 수 있습니다. 당연히 목록에서 위치를 추가하거나 제거하고 싶을 수 있으므로 목록을 변경할 수 있습니다. 반면에 기존 위치에서 항목을 추가하거나 제거하는 것은 의미가 없으므로 튜플은 변경할 수 없습니다.
예를 들어 페이지 라인을 반복 할 때 기존 위치 튜플 내에서 항목을 변경하려는 상황이있을 수 있습니다. 그러나 튜플 불변성은 각 새 값에 대해 새 위치 튜플을 작성하도록합니다. 이것은 그 자체로는 불편한 것처럼 보이지만 이와 같은 불변의 데이터를 사용하는 것은 가치 유형과 기능적 프로그래밍 기술의 초석이며 상당한 이점을 가질 수 있습니다.
이 문제에 대한 몇 가지 흥미로운 기사가 있습니다. 예를 들어 "Python 튜플은 상수 목록이 아닙니다" 또는 "Python의 튜플 vs. 목록 이해"등이 있습니다. 공식 파이썬 문서 에도 언급 되어 있습니다
"Tuples는 불변이며 일반적으로 이기종 시퀀스를 포함합니다 ...".
Haskell 과 같은 정적으로 유형이 지정된 언어 에서 튜플의 값은 일반적으로 다른 유형을 가지며 튜플의 길이는 고정되어야합니다. 목록에서 값은 모두 같은 유형이며 길이는 고정되어 있지 않습니다. 따라서 그 차이는 매우 분명합니다.
마지막으로 파이썬 에는 namedtuple 이 있는데, tuple은 이미 구조를 가지고 있기 때문에 의미가 있습니다. 이것은 튜플이 클래스와 인스턴스에 대한 경량 대안이라는 아이디어를 강조합니다.
collections.namedtuple
더 잘 부를 것 같은 느낌이 든다 collections.record
. 예를 들어 고객 레코드에서 이름과 주소를 바꾸는 것은 의미가 없습니다. 실제로, 그렇게하는 것은 일반적으로 튜플의 불변성이 커밋을 방해하는 오류 일 것입니다.
What would you do with such a list?
는 ppl이 판타지 부족을 인수로 사용할 때 항상 떨립니다 . 혼합 유형 목록을 사용하면 각 계층 구조가 하위 목록과 값 요소로 구성된 일부 계층 적 데이터 구조에 적합합니다.
리스트와 튜플의 차이점
오자
someTuple = (1,2)
someList = [1,2]
크기
a = tuple(range(1000))
b = list(range(1000))
a.__sizeof__() # 8024
b.__sizeof__() # 9088
튜플 연산의 크기가 작기 때문에 조금 더 빠르지 만 많은 요소가있을 때까지 언급하지는 않습니다.
허용 된 작업
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
용법
리스트는 변경 가능하기 때문에 튜플을 사용할 수있는 반면 사전에서는 키로 사용할 수 없습니다.
a = (1,2)
b = [1,2]
c = {a: 1} # OK
c = {b: 1} # Error
3. Permitted operation
는 튜플 케이스를 먼저 보여줍니다. 나는 성공과 오류를 보여주는 것이 일반적이라는 것을 알고 있지만 잠시 동안 내 머리를 어지럽 혔다.
one_item_list = [a]
있지만 one_tuple = (a,)
해당 튜플입니다. 변수 이름 뒤에 쉼표를 적어 둡니다. 또한 참고하십시오 two_tuple = (a, b)
. 이것은 나를 두 번 이상 던졌습니다 (여전히 Python 3에는 있습니다).
tuple(sorted(the_unsorted_tuple))
산책을 갔다면 (x,y)
튜플 에서 언제든지 좌표를 확인할 수 있습니다 .
여행을 기록하려면 몇 초마다 위치를 목록에 추가 할 수 있습니다.
그러나 당신은 다른 방법으로 그것을 할 수 없었습니다.
주요 차이점은 튜플은 변경 불가능하다는 것입니다. 즉, 튜플을 만든 후에는 값을 변경할 수 없습니다.
따라서 값을 변경해야 할 경우 List를 사용하십시오.
튜플의 이점 :
frozenset
다양한 제 3 자 고정 dict / tree / etc 와 같은 모든 불변 컬렉션에 대해서도 마찬가지입니다 . 유형이 있지만 변경 가능한 요소를 추가 할 수있는 것은 없습니다. (물론 튜플은 모든 요소가 있으므로, 일반적인 EAFP 방식의 핸들 인 경우에만 해쉬입니다 d[1, [2]]
올릴 것이다 TypeError: unhashable type: 'list'
.)
리스트는 변경 가능합니다. 튜플은 없습니다.
에서 docs.python.org/2/tutorial/datastructures.html
튜플은 변경할 수 없으며 일반적으로 압축 풀기 (이 섹션의 뒷부분 참조) 또는 인덱싱 (또는 명명 된 튜플의 경우 속성 별)을 통해 액세스되는 이기종 시퀀스의 요소를 포함합니다. 목록은 변경 가능하며 해당 요소는 일반적으로 동종이며 목록을 반복하여 액세스합니다.
그건 언급 차이가 크게 의미이다 : 사람들이 튜플 및 목록은 다른 정보를 나타내는 것으로 기대합니다. 그러나 이것은 지침보다 더 나아갑니다. 일부 라이브러리는 전달 된 내용에 따라 실제로 다르게 작동합니다. 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 목록과 튜플 내에서 완전히 다른 것입니다.
type(a_list) != type(a_tuple)
기초한 라이브러리 코드 분기 type(x)
는 다르게 동작한다는 것입니다.
'%d %d' % [2, 3]
A는 TypeError
처음에 목록을 전달하려고 노력하고 있기 때문에, %d
당신은 두 번째에 어떤 값을 전달하지 않는 %d
. (그러나, 이것에도 반대의 예가 있습니다 max
...)
리스트는 루핑을위한 것이고 튜플은 구조를위한 것 "%s %s" %tuple
입니다.
목록은 일반적으로 동종이고 튜플은 일반적으로 이종입니다.
리스트는 가변 길이, 튜플은 고정 길이입니다.
다음은 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 위에 위치하기 때문입니다. 요소는 전체로 간주되며 주어진 속성에 대해 일반적으로 단일 질문에 대한 답변을 주어진 속성에 대해 어떻게 제공합니까? 속성은 일정하게 유지되며 객체 / 대상은 다릅니다.
대중 문화와 프로그래머에있어 이러한 차이를 따르지 않는 수많은 사례가 있으며, 메인 코스에 샐러드 포크를 사용할 수도 있습니다. 하루가 끝나면 괜찮아 둘 다 보통 일을 끝낼 수 있습니다.
더 자세한 내용을 요약하려면
유사점 :
인덱싱, 선택 및 슬라이싱 -튜플과 괄호 안에있는 정수 값을 사용하여 인덱스를 나열합니다. 따라서 주어진 목록이나 튜플의 처음 3 개 값을 원하면 구문은 같습니다.
>>> my_list[0:3]
[0,1,2]
>>> my_tuple[0:3]
[a,b,c]
비교 및 정렬 -두 개의 튜플 또는 두 개의 목록은 첫 번째 요소를 기준으로 비교되며, 넥타이가 있으면 두 번째 요소 등을 기준으로 비교됩니다. 이전 요소에 차이가 나타난 후 후속 요소에 더 이상주의를 기울이지 않습니다.
>>> [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
차이점 : -사전 정의
구문 -목록 사용 [], 튜플 사용 ()
변경 가능성 -주어진 목록의 요소는 변경 가능하며, 주어진 튜플의 요소는 변경할 수 없습니다.
# 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
해시 테이블 (사전) -해시 테이블 (사전)에서는 키를 해시 할 수 있고 변경할 수 없어야하므로 튜플 만 목록이 아닌 사전 키 역할을 할 수 있습니다.
#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}
차이점-사용중인 포스터 리 오리
요소의 동질성 대 이질성-일반적으로 목록 객체는 동종이고 튜플 객체는 이종입니다. 즉, 목록은 같은 유형의 객체 / 대상 (모든 대통령 후보, 모든 노래 또는 모든 주자 등)에 사용되는 반면, 튜플은 이기종 객체에 더 적합합니다.
루핑 대 구조-둘 다 루핑을 허용하지만 (my_list에서 x의 경우 ...) 목록에 대해 루핑하는 것이 합리적입니다. 튜플은 정보를 구성하고 제시하는 데 더 적합합니다 (% s에있는 % s % s은 (는) % s이고 현재 % s %입니다 ( "John", "Wayne", 90210, "Actor", "Dead")).
튜플과리스트는 파이썬에서 비슷한 시퀀스 유형으로 보입니다.
리터럴 구문
괄호 ( )를 사용 하여 튜플과 대괄호
[ ]
를 만들어 새 목록을 얻습니다. 또한 적절한 유형의 호출을 사용하여 필요한 구조 (튜플 또는 목록)를 얻을 수 있습니다.
someTuple = (4,6)
someList = [2,6]
돌연변이
튜플은 변경할 수 없지만 목록은 변경할 수 있습니다. 이 점은 다음 사항의 기본입니다.
메모리 사용량
변경 가능성으로 인해 목록에 더 많은 메모리가 필요하고 튜플에 더 적은 메모리가 필요합니다.
확장
튜플의 ID가 변경된다는 차이점만으로 튜플과 목록에 새 요소를 추가 할 수 있습니다 (즉, 새 객체가 생성됨).
해싱
튜플은 해시 가능하며 목록은 없습니다. 그것은 튜플을 사전의 키로 사용할 수 있음을 의미합니다. 리스트는 사전에서 키로 사용할 수 없지만 튜플은 사용할 수 있습니다
tup = (1,2)
list_ = [1,2]
c = {tup : 1} # ok
c = {list_ : 1} # error
의미론
이 시점은 모범 사례에 관한 것입니다. 튜플은 이기종 데이터 구조로 사용해야하지만 목록은 동종 시퀀스입니다.
튜플은 이기종 데이터 구조 인 반면, 목록은 균질 한 시퀀스가되어야합니다.
사람들이 이미 여기에 대답 했지만 tuples
불변이지만 변하지 않는 lists
튜플 사용의 중요한 측면이 있습니다.
내부에 tuple
a 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
예외없이 불변 의 상태가 유지됩니다.
PEP 484 - 유형 힌트 (A)의 요소의 종류가 있다고 tuple
개별적으로 입력 할 수 있습니다; 말할 수 있도록 Tuple[str, int, float]
; 그러나이 list
함께 List
입력 클래스 하나만 입력 파라미터를 취할 수있다 : List[str]
상기 (2)의 차이점은 실제로 전자가 후자 반면 본질적 동종 이종 있다는 것을 암시한다.
또한 표준 라이브러리는 대부분 튜플을 C가 a를 반환하는 표준 함수의 반환 값으로 사용합니다 struct
.
사람들이 이미 차이점을 언급했듯이 튜플 이유에 대해 쓸 것입니다.
튜플이 선호되는 이유는 무엇입니까?
작은 튜플에 대한 할당 최적화
파이썬은 메모리 조각화를 줄이고 할당 속도를 높이기 위해 오래된 튜플을 재사용합니다. 튜플이 더 이상 필요하지 않고 영구적으로 삭제하는 대신 항목이 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
우선, 둘 다 파이썬에서 비-스칼라 객체 (복합 객체라고도 함)입니다.
+
(물론 새로운 튜플이 생성됩니다)(3,) # -> (3)
대신 싱글 톤(3) # -> 3
[3]
new_array = origin_array[:]
[x**2 for x in range(1,7)]
는 당신에게 제공합니다
[1,4,9,16,25,36]
(읽을 수 없음)list를 사용하면 앨리어싱 버그 (같은 객체를 가리키는 두 개의 고유 한 경로)가 발생할 수도 있습니다.
리스트는 변경 가능하고 튜플은 변경 불가능합니다. 이 예제를 고려하십시오.
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.
따라서 다음 코드는 튜플에 유효하지 않은 것으로 판명되었습니다. 튜플을 업데이트하려고 시도했지만 허용되지 않습니다.
리스트는 변경 가능하고 튜플은 변경 불가능합니다. 변경 가능과 변경 불가능의 주요 차이점은 항목을 추가하려고 할 때 메모리 사용량입니다.
변수를 만들면 일부 고정 메모리가 변수에 할당됩니다. 목록 인 경우 실제로 사용 된 것보다 더 많은 메모리가 할당됩니다. 예를 들어 현재 메모리 할당이 100 바이트 인 경우 101 번째 바이트를 추가하려는 경우 다른 100 바이트가 할당 될 수 있습니다 (이 경우 총 200 바이트).
그러나 새 요소를 자주 추가하지 않는 경우 튜플을 사용해야합니다. 튜플은 필요한 메모리의 정확한 크기를 할당하므로 특히 큰 메모리 블록을 사용할 때 메모리를 절약합니다.