programing

python 목록에는 pop()이 있지만 push()는 없는 이유는 무엇입니까?

goodjava 2022. 12. 20. 21:17

python 목록에는 pop()이 있지만 push()는 없는 이유는 무엇입니까?

Python이 왜 Python인지 ?list.append는 ""라고 불리지 .list.push가 이미 존재하고 있는 것을 고려하면list.pop) 및 "1로 색인화됨)를합니다.list.append멘틱이 ?치 ??? ??? ???

왜냐하면 'append'는 'pop'이 생각나기 훨씬 전부터 존재했기 때문이다.Python 0.9.1은 1991년 초에 list.append를 지원했습니다.이와는 대조적으로, 1997년에 팝을 추가하는 것에 대한 comp.lang.python에 대한 논의의 일부입니다.Guido는 다음과 같이 썼다.

스택을 구현하려면 list.pop() primitive를 추가해야 합니다(그리고 저는 어떤 원칙에서도 이 특정 것에 반대하지 않습니다).list.push()는 list.pop()와의 대칭성을 위해 추가할 수 있지만, 저는 같은 작업에 대해 여러 이름을 사용하는 것을 별로 좋아하지 않습니다.조만간 다른 하나를 사용하는 코드를 읽게 되므로 두 가지 모두 학습할 필요가 있습니다.이것은 인지 부하가 더 큰 것입니다.

Push/pop/put/pull이 [0] 요소인지 또는 Icon 목록에 대한 참조를 게시하는 요소 [-1] 뒤에 있어야 하는지에 대한 아이디어도 확인할 수 있습니다.

이 모든 것은 리스트 오브젝트 구현에서 제외하는 것이 가장 좋다고 생각합니다.스택이나 큐가 필요한 경우, 특정 의미론을 사용하여 리스트를 사용하는 작은 클래스를 작성합니다.

즉, 이미 fast append() 및 del list[-1]를 지원하는 Python 목록으로 직접 구현된 스택의 경우 list.pop()이 기본적으로 마지막 요소에서 작동하는 것이 의미가 있습니다.비록 다른 언어들이 다르게 한다고 해도.

여기서 암시하는 것은 대부분의 사용자가 목록에 추가할 필요가 있지만 목록을 스택으로 취급할 필요가 있는 경우는 훨씬 적다는 것입니다.그 때문에 list.append는 훨씬 일찍 도입되었습니다.

왜냐하면 그것은 추가되기 때문이다. 밀어내지 않는다."추가"는 목록의 끝에 추가되고 "밀기"는 앞에 추가됩니다.

큐와 스택을 생각해 보세요.

http://docs.python.org/tutorial/datastructures.html

편집: 제 두 번째 문장을 좀 더 정확하게 바꿔 말하면, "첨부"는 기본 구현에 관계없이 목록 끝에 무언가를 추가하는 것을 의미합니다."푸시"될 때 새 요소가 추가되는 위치가 명확하지 않습니다.스택을 푸시하는 것은 "최상위"에 배치하는 것이지만, 실제로 기본 데이터 구조에서 배치되는 위치는 구현에 따라 완전히 달라집니다.한편 큐에 푸시하는 것은 큐를 끝에 추가하는 것을 의미합니다.

목록에 요소를 추가해서?푸시는 보통 스택을 참조할 때 사용됩니다.

"추가"는 직관적으로 "목록 끝에 추가"를 의미하기 때문입니다.만약 그것이 "밀기"라고 불린다면, 우리가 맨 끝에 무언가를 추가하고 있는지 목록 맨 위에 추가하고 있는지 불분명할 것입니다.

공식 답변은 아니지만(언어 사용에 근거한 추측일 뿐) Python에서는 목록을 스택으로 사용할 수 있습니다(: 튜토리얼의 섹션 5.1.1).그러나 목록은 여전히 가장 먼저 목록이기 때문에 두 작업에 공통적인 작업은 스택 용어(푸시)가 아닌 목록 용어(추가)를 사용합니다.pop 조작은 리스트에서는 그다지 일반적이지 않기 때문에('remove Last'를 사용할 수 있었지만) pop()을 정의했지만 push()는 정의하지 않았습니다.

참고로 푸시 방식으로 목록을 만드는 것은 그리 어렵지 않습니다.

>>> class StackList(list):
...     def push(self, item):
...             self.append(item)
... 
>>> x = StackList([1,2,3])
>>> x
[1, 2, 3]
>>> x.push(4)
>>> x
[1, 2, 3, 4]

스택은 다소 추상적인 데이터 유형입니다.「푸시」와 「팝」의 개념은, 스택의 실제 실장 방법과는 거의 무관합니다.예를 들어 다음과 같은 스택을 이론적으로 구현할 수 있습니다(이유는 모르겠지만).

l = [1,2,3]
l.insert(0, 1)
l.pop(0)

...링크 리스트를 사용하여 스택을 구현한 적은 없습니다.

좋아요, 개인적인 의견입니다만 '추가'와 '프리펜드'는 집합에서 정확한 위치를 의미하죠

Push와 Pop은 실제로 세트의 어느 한쪽 끝에나 적용할 수 있는 개념입니다.당신이 일관성이 있다면...어떤 이유에서인지 Push()는 세트 전면에 적용되어야 할 것 같습니다.

푸시는 정의된 스택 동작입니다.A를 스택(B,C,D)에 푸시하면 (A,B,C,D)가 됩니다.

python append를 사용한 경우 결과 데이터 세트는 (B,C,D,A)와 같습니다.

편집: 와, 세상에.

제 예시를 보면 리스트의 어느 부분이 톱이고, 어느 부분이 최하위인지 알 수 있을 것입니다.여기 있는 대부분의 사람들이 왼쪽에서 오른쪽으로 읽는다고 가정하면 목록의 첫 번째 요소는 항상 왼쪽에 있습니다.

PEP 20부터 -- Python의 Zen:

그것을 할 수 있는 확실한 방법은 하나, 그리고 가급적 하나뿐이어야 합니다.

다 가지다list.append ★★★★★★★★★★★★★★★★★」list.push 두 예요. 두 가지 방법이 있을 거예요list.append1 이 1 1 1 1.

Python(CPython)의 원래 버전이 C++가 아닌 C로 작성되었기 때문일 것입니다.

무언가를 뒤에 밀어넣음으로써 목록이 형성된다는 생각은 아마도 그것들을 추가하는 생각만큼 잘 알려져 있지 않을 것이다.

나는 비단뱀 신참이다. 나 자신은 이것을 사용한다.

def push(one, array):
    array.append(one)
def pop(array):
    if len(array) > 0:
        one = array[len(array)-1]
        del array[len(array)-1]
        return one
    else:
        return None
def pop_first(array):
    if len(array) > 0:
        one = array[0]
        del array[0]
        return one
    else:
        return None

pop_first()는 목록의 선두에서 추가합니다(pop()의 반대).

코드를 읽기 쉽게 하기 위해서만 append를 사용하는 것은 아닙니다(내 관점에서는).JS, flatter, PHP로 코드화하기 때문에 함수명의 유사성이 중요합니다.

푸쉬 앤 팝은 카페테리아나 뷔페에 접시나 쟁반을 쌓아올리는 은유적인 측면에서 의미가 있습니다.특히 아래쪽에 스프링이 달려있는 홀더 타입의 것은 (거의) 맨 위 접시가...(이론적으로) 같은 장소에 몇 개의 플레이트가 있든 상관없습니다.

트레이를 떼어내면, 스프링의 중량은 조금 적어지고, 스택은 「팝업」되어 플레이트를 되돌리면, 스택은 「밀어내립니다」.따라서 목록을 스택으로 생각하고 마지막 요소를 맨 위에 두면 큰 혼란이 없을 것입니다.

언급URL : https://stackoverflow.com/questions/1566266/why-do-python-lists-have-pop-but-not-push