파이썬리스트는 요소가 삽입 된 순서대로 유지되도록 보장합니까?


318

다음과 같은 파이썬 코드가 있다면

>>> x = []
>>> x = x + [1]
>>> x = x + [2]
>>> x = x + [3]
>>> x
[1, 2, 3]

x항상 보장 할 [1,2,3], 또는 중간 요소의 다른 순서화가 가능하다?

답변:


479

예, 파이썬 목록의 요소 순서는 영구적입니다.


17
이것은 정답이므로 다른 것을 추가하고 싶지 않습니다. 또한 list.append를 사용하여 마음을 진정시킬 수 있습니다. docs.python.org/2/tutorial/datastructures.html
NG.

1
함수에서 로컬 목록을 반환하고 호출 함수에서 로컬 목록을 사용하면 어떻게됩니까? 즉 def fn_1(): lst = [] lst.append(1) lst.append(2) return lstdef fn_2(): print(fn_1())순서는 관계없이 항상 몇 번이나 어디 이제까지 내가 fn_1를 사용의 동일합니다 ()?
TheCuriousOne

6
예, 파이썬 목록의 요소 순서는 영구적입니다. ;)
sge

82

요컨대, 순서는 유지됩니다. 오랫동안 :

일반적으로 다음 정의는 목록과 같은 객체에 항상 적용됩니다.

목록은 중복 요소를 포함하고 명시 적으로 그렇게하게하지 않는 한 일반적으로 변경되지 않습니다 정의 된 순서가 수 요소의 모음입니다. 스택 는 요소를 추가하고 제거하기위한 특정 (종종 제한된) 동작을 제공하는 목록 유형입니다 (LIFO는 스택, FIFO는 큐). 목록은 사물의 목록을 실제로 표현한 것입니다. 문자열은 순서가 중요하고 ( "abc" != "bca") 문자열 내용의 복제본이 확실히 허용되므로 ( "aaa"존재할 수 있음 ) 문자 목록으로 생각할 수 있습니다 != "a".

세트 중복을 포함 할 수 요소의 집합이고, 또는 시간에 걸쳐 변화하지 않을 수있는 비 한정된 순서를 갖는다. 세트는 특정 선택 항목의 범위 를 설명하는만큼 사물 목록을 나타내지 않습니다 . 집합의 내부 구조, 요소가 서로에 대해 저장되는 방식은 일반적으로 유용한 정보를 전달하기위한 것이 아닙니다. 일부 구현에서 집합은 항상 내부적으로 정렬됩니다. 다른 경우 순서는 단순히 정의되지 않습니다 (일반적으로 해시 함수에 따라 다름).

컬렉션 은 (일반적으로 가변적 인) 많은 수의 다른 객체를 저장하는 데 사용되는 객체를 가리키는 일반적인 용어입니다. 목록과 세트는 모두 컬렉션 유형입니다. 튜플과 배열은 일반적으로 컬렉션으로 간주되지 않습니다. 일부 언어는 (다른 객체 간의 연관을 설명하는 컨테이너)을 컬렉션 유형으로 간주합니다.

이 이름 지정 체계는 Python, C ++, Java, C # 및 Lisp를 포함하여 내가 아는 모든 프로그래밍 언어에 적용됩니다 (순서를 지키지 않은 목록은 특히 치명적입니다). 이것이 사실이 아닌 곳을 아는 사람이 있다면 그렇게 말하면 답변을 편집하겠습니다. 특정 구현에서는 이러한 객체 에 C ++의 벡터 및 ALGOL 68의 flex 와 같은 다른 이름을 사용할 수 있습니다 (둘 다 목록; flex는 기술적으로 크기를 조정할 수있는 배열입니다).

+여기 에서 기호 가 어떻게 작동 하는지에 대한 구체적인 내용으로 인해 귀하의 케이스에 혼란이 남아 있다면 , 순서는 목록에 중요하다는 것을 알고 있어야합니다. 그렇지 않을 이유가 없다면 목록 작업이 순서를 유지한다고 가정 할 수 있습니다. . 이 경우 +부호는 문자열 (실제로는 문자 목록 일뿐)의 경우 처럼 동작합니다. 목록의 내용을 가져 와서 다른 내용의 뒤에 배치합니다.

우리가 가지고 있다면

list1 = [0, 1, 2, 3, 4]
list2 = [5, 6, 7, 8, 9]

그때

list1 + list2

와 같다

[0, 1, 2, 3, 4] + [5, 6, 7, 8, 9]

어느 것으로 평가

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

훨씬 좋아

"abdcde" + "fghijk"

생산

"abdcdefghijk"

1
JSON 배열의 사양은 배열이 순서를 유지하도록 지정하지 않기 때문에 배열 연산이 순서를 유지한다고 보장하지는 않습니다. 그래도 그 출처를 찾을 수 없습니다. 그리고 배열의 기본 구조는 여전히 번호가 매겨진 인덱스가있는 객체의 특별한 경우이므로 진술과 모순되지 않고 흥미로운 재미있는 일입니다.
멀티 헌터

1
나는 세트의 설명에 동의하지 않습니다. 세트는 "실제 것보다 수학적 및 이론적 목적에 더 적합"하지 않습니다. 대신, 세트는 반복 될 수없는 항목을 포함하는 컬렉션이 필요할 때마다 매우 유용하며 실제 사용 사례를 모델링하는 데 유용한 차이 및 교차와 같은 도구를 제공합니다.
Pintun

1
@ Pintun이 게시물을 작성한 후 몇 년을 되돌아보고 동의합니다. 내가 목표로하는 것을 표현하는 더 좋은 방법을 찾은 후에 편집하겠습니다.
ApproachingDarknessFish

5

'세트'와 '목록'을 혼동하고 있습니다. 세트는 순서를 보장하지 않지만 목록은 보장합니다.

세트는 중괄호를 사용하여 선언됩니다 : {}. 반대로,리스트는 대괄호를 사용하여 선언됩니다 : [].

mySet = {a, b, c, c}

순서를 보장하지는 않지만 list는 다음을 수행합니다.

myList = [a, b, c]

1
세트 는 또한 비 복제를 보장합니다. 목록에 중복 요소가있을 수 있지만 세트에는 없을 수 있습니다.
Nathaniel Ford

4

예를 들어 2가 다른 숫자가되도록 항목이 변경 될 수 있는지 여부가 귀하와 관련이 있다고 생각합니다. 파이썬에서는 정수를 변경할 수 없기 때문에 마음을 편하게 할 수 있습니다. 즉 , 정수 를 만든 후에는 변경할 수 없습니다.

파이썬의 모든 것이 불변 인 것은 아닙니다. 예를 들어, 목록은 변경 가능합니다. 생성 된 후에 변경 될 수 있습니다. 예를 들어 목록 목록이 있다면

>>> a = [[1], [2], [3]]
>>> a[0].append(7)
>>> a
[[1, 7], [2], [3]]

여기에서 첫 번째 항목을 변경했습니다 a(추가 7했습니다). 조심하지 않으면 주변을 뒤섞 고 예상치 못한 것을 얻는 것을 상상할 수 있습니다 (실제로 이것은 파이썬에서 프로그래밍을 시작할 때 모든 사람들에게 발생합니다. "루핑하면서 목록 수정하기" "수십 개의 예를 볼 수 있습니다).

또한 그 밖의 가치를 가리키는 것 x = x + [a]x.append(a)같은 것이 아니다. 두 번째 x목록은 변이 되며 첫 번째 목록은 새 목록을 만들어 할당합니다 x. 차이점을 보려면 각 y = x항목을 추가 x하고 시도 하기 전에 설정 을 시도 하고 두 사람의 차이점을 확인하십시오 y.


0

aList = [1,2,3]

i = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

목록

[2]

도덕은 목록에 의해 구동되는 루프에서 목록을 수정할 때 두 단계를 수행합니다.

aList=[1,2,3]
i=0
for item in aList:
    if i<2:
        aList[i]="del"
    i+=1

aList

['del', 'del', 3]
for i in range(2):
    del aList[0]

aList
[3]

0

예는 사전이 아닌 반면 목록과 튜플은 항상 주문됩니다.


1
파이썬 3을 제외하고 : D
mbeacom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.