Что означает многоточие [...] в списке?

Я играл в питоне. Я использовал следующий код в IDLE:

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

Выход был:

[1, [...], 2]

Что это […]? Интересно, что теперь я мог бы использовать это как список списка до бесконечности, т.е.

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

Я мог бы написать выше столько, сколько хотел, и это все еще будет работать.

РЕДАКТИРОВАТЬ:

  • Как это представлено в памяти?
  • Каково его использование? Примеры некоторых случаев, когда это полезно, было бы полезно.
  • Любая ссылка на официальную документацию будет очень полезна.

Ответ 1

Это означает, что вы создали бесконечный список, вложенный внутри себя, который не может быть напечатан. p содержит p, который содержит p... и так далее. Обозначение [...] - это способ сообщить об этом и сообщить, что он не может быть представлен! Взгляните на ответ @6502, чтобы увидеть хорошую картину, показывающую, что происходит.

Теперь о трех новых элементах после редактирования:

Ответ 2

Это то, что ваш код создан

enter image description here

Это список, где первый и последний элементы указывают на два числа (1 и 2), а средний элемент указывает на сам список.

В Common Lisp, когда печать круговых структур включена, такой объект будет напечатан как

#1=#(1 #1# 2)

это означает, что существует объект (помеченный 1 с #1=), который представляет собой вектор с тремя элементами, вторым является сам объект (обратная ссылка с #1#).

Вместо этого в Python вы просто получаете информацию о том, что структура круглая с [...].

В этом конкретном случае описание не является двусмысленным (оно обратное указание на список, но существует только один список, поэтому он должен быть один). В других случаях может быть, однако, неоднозначным... например, в

[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)

и они будут в памяти как

enter image description here

Ответ 3

На вопрос "Что его использование", вот конкретный пример.

Сокращение графика - это стратегия оценки, используемая когда-то для интерпретации компьютерного языка. Это общая стратегия для ленивой оценки, особенно функциональных языков.

Отправной точкой является построение графика, представляющего последовательность "шагов", которые программа выполнит. В зависимости от структур управления, используемых в этой программе, это может привести к циклическому графику (потому что программа содержит какой-то цикл "навсегда" - или использует рекурсию, чья "глубина" будет известна во время оценки, но не на графике, время создания)...

Чтобы представить такой график, вам нужны бесконечные "структуры данных" (иногда называемые рекурсивными структурами данных), как и тот, который вы заметили. Как правило, немного сложнее.

Если вас интересует эта тема, здесь (среди многих других) лекция по этому вопросу:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf

Ответ 4

Мы делаем это все время в объектно-ориентированном программировании. Если любые два объекта ссылаются друг на друга, прямо или косвенно, они являются бесконечно рекурсивными структурами (или обе частью одной и той же бесконечно рекурсивной структуры, в зависимости от того, как вы на нее смотрите). Вот почему вы не видите этого в чем-то примитивном, как список, потому что нам обычно лучше описывать концепцию как взаимосвязанные "объекты", чем "бесконечный список".

Вы также можете получить ... с бесконечно рекурсивным словарем. Скажем, вы хотите, чтобы словарь углов треугольника, где каждое значение является словарем других углов, связанных с этим углом. Вы можете настроить его следующим образом:

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), вы увидите, что он заполнен {...}, потому что любые два угла ссылаются друг на друга.

Ответ 5

Как я понял, это пример фиксированной точки

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

Ответ 6

Название этого специального объекта является Ellipsis. Я предполагаю, что он реализован как одноэлементный объект в Python intepreter/VM - что-то вроде None - своего рода часового. Как вы видели, это способ Python представить ссылку списка внутри себя.