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

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

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

Выход был:

[1, [...], 2]

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

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

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

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

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

6 ответов

Решение

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

Теперь о трех новых пунктах после вашего редактирования:

  • Этот ответ, кажется, покрывает это
  • Ссылка Игнасио описывает некоторые возможные применения
  • Это больше тема проектирования структуры данных, чем языков программирования, поэтому вряд ли какая-либо ссылка будет найдена в официальной документации Python

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

Это список, в котором первый и последний элементы указывают на два числа (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, y

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

На вопрос "Для чего он нужен" приведу конкретный пример.

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам