줄임표 […]는 목록에서 무엇을 의미합니까?


196

나는 파이썬에서 놀고있었습니다. 유휴 상태에서 다음 코드를 사용했습니다.

p  = [1, 2]
p[1:1] = [p]
print p

결과는 다음과 같습니다.

[1, [...], 2]

이게 뭐야 […]? 흥미롭게도 나는 이것을 무한대까지의 목록 목록으로 사용할 수 있습니다.

p[1][1][1]....

원하는만큼 위의 내용을 쓸 수 있으며 여전히 작동합니다.

편집하다:

  • 메모리에 어떻게 표현됩니까?
  • 그 용도는 무엇입니까? 유용한 경우의 예가 도움이 될 것입니다.
  • 공식 문서에 대한 링크는 정말 유용합니다.

여전히 EDIT의 첫 번째 및 세 번째 목록 요소에 대한 답변을 찾고 있습니다.
— Aseem Bansal

7
더 간단한 예는 다음과 같습니다 p = [1]; p[0] = p.
— arshajii 2016 년

6
나는 이것이 파이썬에서 목록에서 무엇을 의미합니까? ,이 질문에서 질문 (및 답변)이 더 낫습니다.
— Martin Thoma

1
Dreampie는 똑똑합니다`>>> p [1 : 1] = [p] >>> p 3 : [1, <id = 3074777548>로 목록에 재귀], 2] >>>`정확한 세부 정보 제공
— Rahul Gautam

@RahulGautam받지 못했습니다 p 3: [1, <Recursion on list with id=3074777548>, 2]. 무엇을 뛰었습니까?
— Aseem Bansal

답변:


112

내부에 중첩 된 무한 목록을 작성 했으므로 인쇄 할 수 없습니다. p포함 p포함하는 p등등 ... 그리고. [...]표기법은 당신이 알고, 그것이 표현 될 수 없음을 알려 할 수있는 방법입니다! @ 6502의 답변을보고 무슨 일이 일어나고 있는지 보여주는 멋진 그림을보십시오.

이제 편집 후 세 가지 새로운 항목에 대해

  • 이 답변 은 그것을 커버하는 것 같습니다
  • Ignacio의 링크 는 몇 가지 가능한 용도를 설명합니다
  • 이것은 프로그래밍 언어보다 데이터 구조 설계의 주제이므로 파이썬의 공식 문서에서 참조가 발견되지는 않습니다.

그래서 그것은 무한한 기억을 취하고 있습니까? 나는 그것이 불가능하다는 것을 안다. 그것이 어떻게 표현되고 어떻게 사용됩니까?
— Aseem Bansal

21
@Zel : 목록 요소는 참조입니다. 두 번째 요소는 목록 자체에 대한 참조입니다.
— Ignacio Vazquez-Abrams

2
파이썬은 그것을 무한 참조 루프로 식별했기 때문에 짧게하기로 결정했습니다. 정말 무한하지 않습니다. 그리고 아니, 정말 아니다 유용합니다 :) 생각 실험 외에
— 오스카르 로페스

2
무한 재귀 구조에는 몇 가지 용도가 있습니다. 그러나 많지는 않습니다.
— Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams 몇 가지 예가 유용 할 것입니다.
— Aseem Bansal

316

이것이 코드가 만든 것입니다

여기에 이미지 설명을 입력하십시오

첫 번째 요소와 마지막 요소가 두 개의 숫자 (1과 2)를 가리키고 중간 요소가 목록 자체를 가리키는 목록입니다.

일반 리스프에서 원형 구조 인쇄가 활성화되면 이러한 개체는 다음과 같이 인쇄됩니다.

#1=#(1 #1# 2)

즉 #1=, 3 개의 요소가있는 벡터 인 객체 (1로 표시됨)가 있고, 두 번째는 객체 자체입니다 (와 역 참조 됨 #1#).

파이썬에서는 대신 구조가 원형이라는 정보를 얻습니다 [...].

이 특정 경우 설명은 모호하지 않습니다 (역순으로 목록을 가리 키지 만 하나의 목록 만 있으므로 해당 목록이어야 함). 그러나 다른 경우에는 모호 할 수 있습니다 ... 예를 들어

[1, [2, [...], 3]]

역방향 참조는 외부 또는 내부 목록을 가리킬 수 있습니다. 동일한 방식으로 인쇄 된이 두 가지 구조는

x = [1, [2, 3]]
x[1][1:1] = [x[1]]

y = [1, [2, 3]]
y[1][1:1] = [y]

print(x)
print(y)

그리고 그들은 메모리에있을 것입니다

여기에 이미지 설명을 입력하십시오


[1, [2, [...], 3]]다음 x[1] = [2, [...], 3]과 같은 내용을 찾을 수 있습니다 : 및 y[1] = [2, 1, [...]], 3]. 이것은 x가 1로 구성되고 반복되는 2로 구성되는 반면 y는 교대로 1과 2로 구성됨을 의미합니다.
— pascalhein 2016 년

2
@csharpler : 물론 내용을 분석하여 두 가지를 구별 할 수는 있지만 동일한 표현으로 인쇄됩니다. 커먼 리스프 형식으로 대신 그들은 것 #(1 #1=#(2 #1# 3))을 위해 x및 #1=#(1 #(2 #1# 3))위해 y.
— 6502

5
@BurhanKhalid는 : 두 번째의 제 김프에 대한 잉크 스케이프 (I 멀리 SVG를 던졌다 때문에)
— 6502

1
@csharpler :리스트는 실제로 링크 된리스트가 아니라 크기를 조정할 수있는 배열이기 때문에 파이썬에서 "무한리스트"를 만들 수 없습니다. 대신 Common Lisp의 "무한 목록"을 만들 수 있습니다 #1=(1 . #1#).
— 6502

1
+ 다음과 같이 acsii-diagram을 그리려면 Asiiflow
— Grijesh Chauhan

23

"무엇을 사용합니까?"라는 질문에 구체적인 예가 있습니다.

그래프 축소 는 컴퓨터 언어를 해석하기 위해 언젠가 사용되는 평가 전략입니다. 이는 특히 기능적 언어의 게으른 평가를위한 일반적인 전략입니다.

시작점은 프로그램이 수행 할 "단계"순서를 나타내는 그래프를 작성하는 것입니다. 이 프로그램에서 사용되는 제어 구조에 따라이은으로 이어질 수있는 순환 또는 그 "깊이"로 알려진 것입니다 사용 재귀 - 프로그램이 "영원히"루프의 일종 포함하고 있기 때문에 (그래프 평가 시간이 아니라에서, graph- 제작 시간) ...

이러한 그래프를 나타내려면 눈에 띄는 것과 같이 무한한 "데이터 구조"( 재귀 데이터 구조 라고도 함 )가 필요합니다. 일반적으로 조금 더 복잡합니다.

이 주제에 관심이 있다면, 그 주제에 관한 강의가 여기에 있습니다 :
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf


7

우리는 항상 객체 지향 프로그래밍에서이 작업을 수행합니다. 두 객체가 직접 또는 간접적으로 서로 참조하는 경우 모두 무한 재귀 구조 (또는 보는 방식에 따라 동일한 무한 재귀 구조의 두 부분)입니다. 그렇기 때문에 당신은 이것을 목록처럼 원시적 인 것으로 보지 않는 것입니다. 왜냐하면 우리는 개념을 "무한 목록"보다 상호 연결된 "객체"로 묘사하는 것이 더 낫기 때문입니다.

...무한 재귀 사전을 사용할 수도 있습니다 . 삼각형의 모서리 사전을 원한다고 가정 해 봅시다. 각 값은 해당 모서리에 연결된 다른 모서리의 사전입니다. 다음과 같이 설정할 수 있습니다.

a = {}
b = {}
c = {}
triangle = {"a": a, "b": b, "c": c}
a["b"] = b
a["c"] = c
b["a"] = a
b["c"] = c
c["a"] = a
c["b"] = b

인쇄 이제 경우 triangle(또는 a또는 b또는 c그 문제에 대한), 당신은 가득 볼 수 {...}있는 두 개의 모서리가 서로 다시 언급하고 있기 때문이다.


보다 간단한 사전 예 :a = {}; a['a'] = a; print a['a']['a']['a']
— user650654

나를 위해, "..."대신 "<id = ___로 dict에 재귀"를 표시합니다.
— Solomon Ucko

@SolomonUcko 아마도 pprint 를 사용 하여 물건을 인쇄 하는 IPython을 사용하고있을 것입니다. %pprint예쁜 인쇄를 토글 하려면 입력 하면이 표시 ...됩니다.
— nmclean

4

내가 이해했듯이, 이것은 고정 소수점의 예입니다.

p  = [1, 2]
p[1:1] = [p]
f = lambda x:x[1]
f(p)==p
f(f(p))==p

나는 이것을 이해할 수 없었다. 이 명령을 실행하려고했지만 오류가 있습니다.
— Aseem Bansal 2018 년

@Zel : p가 선언되도록 OPs 코드를 추가해야합니다.
— Inkane 2016 년

1
@Zel : 글쎄, 나는 그것이 얼마나 도움이되는지 잘 모르겠지만, Firegun은 p (따라서 [...]로 표시되는 p [1])는 함수 f의 고정 점이라고 말합니다. IMHO, 이것은 "[...]는 무엇입니까?"라는 질문에 대한 가능한 대답입니다. 이 경우
— Inkane 2018 년

1
작동 p = [1]; p[0] = p해야하는 간단한 예제를 시도한 후에이 예제를 시도했기 때문에 동일한 오류 문제가 발생 f = lambda x:x[0]했습니다. 이것은 수정 점의 예이지만 아직 이것이 어떻게 유용한 지 알 수 없었습니다. 수정 지점의 실제 가치는 다른 지점에서 재귀 또는 반복 방식으로 도달합니다. 가능한 경우, 원래 질문의 목록 구조를 사용하여 Y 조합자를 만드는 방법을 보여주는 예가 도움이 될 것입니다.
— dansalmo 2016 년

1
q = lambda: q무한 호출 람다한다
— whackamadoodle3000

-2

해당 특수 객체의 이름은 줄임표입니다. 필자는 파이썬 인 테프 리터 / VM에서 None과 같은 단일 객체로 구현되어 일종의 센티넬이라고 생각합니다. 보시다시피 파이썬이 그 자체로 목록의 참조를 나타내는 방법입니다.


이상하게도 Ellipsis 객체를 직접 인스턴스화하는 방법이없는 것 같습니다. 예를 들어 이름은 Builtins 인터페이스를 통해 노출되지 않습니다. 따라서 생략 부호를 색인으로 사용하여 항목을 추출하려는 경우와 같이 특정 오류 (예외 예외)에서 용어에 대한 참조를 볼 수 있습니다. 그러나 당신은 말할 수 있습니다 : el = Ellipsis () 또는 그와 비슷한 것 (내가 찾은 것).
— Jim Dennis

9
이것은 실제로 Ellipsis 객체와 관련이 없습니다. 문자 그대로의 문자열 "[...]"입니다. 목록을 인쇄하는 동안주기가 감지되면 인쇄됩니다. 코드 참조 : hg.python.org/cpython/file/84d6c1c0665e/Objects/…
— Jeremy Sharpe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.