Я играл на питоне. Я использовал следующий код в IDLE:
p = [1, 2]
p[1:1] = [p]
print p
Выход был:
[1, [...], 2]
Что это […]
? Интересно, что теперь я мог бы использовать это как список списка до бесконечности, т.е.
p[1][1][1]....
Я мог бы написать выше столько, сколько я хотел, и это все еще будет работать.
РЕДАКТИРОВАТЬ:
- Как это представлено в памяти?
- Каково его использование? Примеры некоторых случаев, когда это полезно, было бы полезно.
- Любая ссылка на официальную документацию была бы действительно полезной.
python
python-2.7
python-3.x
list
ellipsis
Aseem Bansal
источник
источник
p = [1]; p[0] = p
.p 3: [1, <Recursion on list with id=3074777548>, 2]
. Что ты бежал?Ответы:
Это означает, что вы создали бесконечный список, вложенный внутрь себя, который нельзя распечатать.
p
содержит,p
который содержитp
... и так далее.[...]
Нотация является способом , чтобы вы знали это, и сообщить , что он не может быть представлен! Посмотрите на ответ @ 6502, чтобы увидеть красивую картинку, показывающую, что происходит.Теперь о трех новых пунктах после вашего редактирования:
источник
Это то, что ваш код создан
Это список, где первый и последний элементы указывают на два числа (1 и 2), а средний элемент указывает на сам список.
В Common Lisp, когда печать круговых структур включена, такой объект будет напечатан как
это означает, что существует объект (помеченный 1 с
#1=
), который является вектором с тремя элементами, второй является самим объектом (обратная ссылка с#1#
).Вместо этого в Python вы просто получаете информацию о том, что структура круговая
[...]
.В этом конкретном случае описание не является двусмысленным (это обратное указание на список, но существует только один список, поэтому он должен быть тем). В других случаях может быть, однако, неоднозначным ... например, в
обратная ссылка может указывать либо на внешний, либо на внутренний список. Эти две разные структуры, напечатанные одинаково, могут быть созданы с
и они будут в памяти как
источник
[1, [2, [...], 3]]
как это:x[1] = [2, [...], 3]
иy[1] = [2, 1, [...]], 3]
. Это означает, что x состоит из 1 и затем повторяющихся 2s, тогда как y состоит из чередующихся 1s и 2s.#(1 #1=#(2 #1# 3))
дляx
и#1=#(1 #(2 #1# 3))
дляy
.#1=(1 . #1#)
.На вопрос «Что это такое», приведу конкретный пример.
Сокращение графика - это стратегия оценки, которая иногда используется для интерпретации компьютерного языка. Это общая стратегия для ленивых вычислений, особенно функциональных языков.
Отправной точкой является построение графика, представляющего последовательность «шагов», которые предпримет программа. В зависимости от управляющих структур, используемых в этой программе, это может привести к циклическому графу (поскольку программа содержит некий «вечный» цикл - или использовать рекурсию, «глубина» которой будет известна во время оценки , но не на графике). время создания ) ...
Чтобы представить такой граф, вам нужны бесконечные «структуры данных» (иногда называемые рекурсивными структурами данных), подобные той, которую вы заметили. Обычно немного сложнее, хотя.
Если вы заинтересованы в этой теме, вот (среди многих других) лекция на эту тему:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf
источник
Мы делаем это все время в объектно-ориентированном программировании. Если любые два объекта ссылаются друг на друга, прямо или косвенно, они оба являются бесконечно рекурсивными структурами (или обе являются частью одной бесконечно рекурсивной структуры, в зависимости от того, как вы на нее смотрите). Вот почему вы не видите этого в чем-то столь же примитивном, как список - потому что мы обычно лучше описываем концепцию как взаимосвязанные «объекты», чем «бесконечный список».
Вы также можете получить
...
бесконечно рекурсивный словарь. Допустим, вам нужен словарь углов треугольника, где каждое значение является словарем других углов, соединенных с этим углом. Вы можете настроить его так:Теперь , если вы печатаете
triangle
(илиa
илиb
илиc
на то пошло), вы увидите , что он полон ,{...}
потому что любые два угла имеют в виду обратно друг к другу.источник
a = {}; a['a'] = a; print a['a']['a']['a']
%pprint
чтобы отключить симпатичную печать, он покажет...
.Как я понял, это пример с фиксированной точкой
источник
p = [1]; p[0] = p
пример, который долженf = lambda x:x[0]
работать. Это пример точки исправления, но я пока не смог понять, насколько полезно это знать. Реальное значение точки фиксации заключается в ее достижении из некоторой другой точки рекурсивным или итеративным образом. Пример, который показывает, как использовать структуру списка исходного вопроса для создания комбинатора Y, будет полезен, если это возможно.q = lambda: q
делает бесконечно вызываемую лямбдуНазвание этого специального объекта - Ellipsis. Я предполагаю, что он реализован как одноэлементный объект в Python intepreter / VM - что-то вроде None - своего рода часовой. Как вы уже видели, это способ для Python представить ссылку на список внутри себя.
источник