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


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.