Eu estava brincando em python. Eu usei o seguinte código no IDLE:
p = [1, 2]
p[1:1] = [p]
print p
A saída foi:
[1, [...], 2]
O que é isso […]
? Curiosamente, agora eu poderia usar isso como uma lista de lista de lista até o infinito, ou seja
p[1][1][1]....
Eu poderia escrever o texto acima contanto que quisesse e ainda funcionasse.
EDITAR:
- Como é representado na memória?
- Qual é o seu uso? Exemplos de alguns casos em que é útil seriam úteis.
- Qualquer link para a documentação oficial seria realmente útil.
python
python-2.7
python-3.x
list
ellipsis
Aseem Bansal
fonte
fonte
p = [1]; p[0] = p
.p 3: [1, <Recursion on list with id=3074777548>, 2]
. O que você correu?Respostas:
Isso significa que você criou uma lista infinita aninhada dentro de si mesma, que não pode ser impressa.
p
contém op
que contémp
... e assim por diante. A[...]
notação é uma maneira de informá-lo e informar que ela não pode ser representada! Dê uma olhada na resposta do @ 6502 para ver uma bela imagem mostrando o que está acontecendo.Agora, sobre os três novos itens após a sua edição:
fonte
Isto é o que seu código criou
É uma lista em que o primeiro e o último elementos estão apontando para dois números (1 e 2) e onde o elemento do meio está apontando para a própria lista.
No Common Lisp, quando a impressão de estruturas circulares está ativada, esse objeto seria impresso como
significando que existe um objeto (rotulado com 1
#1=
) que é um vetor com três elementos, o segundo sendo o próprio objeto (com referência anterior#1#
).Em Python, você obtém as informações com as quais a estrutura é circular
[...]
.Nesse caso específico, a descrição não é ambígua (está apontando para trás para uma lista, mas há apenas uma lista, portanto deve ser essa). Em outros casos, pode ser ambíguo ... por exemplo, em
a referência anterior pode apontar para a lista externa ou interna. Essas duas estruturas diferentes impressas da mesma maneira podem ser criadas com
e eles estariam na memória como
fonte
[1, [2, [...], 3]]
assim:x[1] = [2, [...], 3]
ey[1] = [2, 1, [...]], 3]
. Isso significa que x consiste em 1 e depois repete 2s, enquanto y consiste em alternar 1s e 2s.#(1 #1=#(2 #1# 3))
parax
e#1=#(1 #(2 #1# 3))
paray
.#1=(1 . #1#)
.Para a pergunta "Qual é o seu uso", aqui está um exemplo concreto.
A redução de gráfico é uma estratégia de avaliação usada em algum momento para interpretar uma linguagem de computador. Essa é uma estratégia comum para avaliação lenta, principalmente de linguagens funcionais.
O ponto de partida é criar um gráfico representando a sequência de "etapas" que o programa executará. Dependendo das estruturas de controle usadas no programa, isso pode levar a um gráfico cíclico (porque o programa contém algum tipo de loop "para sempre" - ou usa uma recursão cuja "profundidade" será conhecida no momento da avaliação , mas não no gráfico. hora de criação ) ...
Para representar esse gráfico, você precisa de "estruturas de dados" infinitas (às vezes chamadas de estruturas de dados recursivas ), como a que você notou. Geralmente, um pouco mais complexo.
Se você estiver interessado nesse tópico, aqui está (entre muitos outros) uma palestra sobre esse assunto:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf
fonte
Fazemos isso o tempo todo na programação orientada a objetos. Se dois objetos se referirem um ao outro, direta ou indiretamente, eles são estruturas infinitamente recursivas (ou ambas fazem parte da mesma estrutura infinitamente recursiva, dependendo de como você olha para ele). É por isso que você não vê isso em algo tão primitivo quanto uma lista - porque geralmente é melhor descrever o conceito como "objetos" interconectados do que uma "lista infinita".
Você também pode obter
...
um dicionário infinitamente recursivo. Digamos que você queira um dicionário dos cantos de um triângulo, em que cada valor seja um dicionário dos outros cantos conectados a esse canto. Você pode configurá-lo assim:Agora, se você imprimir
triangle
(oua
oub
ouc
para que o assunto), você verá que é cheio de{...}
porque nenhum dois cantos nos referindo a volta para o outro.fonte
a = {}; a['a'] = a; print a['a']['a']['a']
%pprint
para desativar a impressão bonita, será exibido...
.Como eu entendi, este é um exemplo de ponto fixo
fonte
p = [1]; p[0] = p
exemplo mais simples que precisaf = lambda x:x[0]
funcionar. É um exemplo de ponto de correção, mas ainda não consegui ver como isso é útil. O valor real do ponto de correção está chegando a ele de algum outro ponto de maneira recursiva ou iterativa. Um exemplo que mostra como usar a estrutura de lista da pergunta original para criar o combinador Y seria útil se possível.q = lambda: q
faz uma lambda infinitamente exigívelO nome desse objeto especial é reticências. Eu acho que ele é implementado como um objeto singleton no intérprete / VM do Python - algo como None - um tipo de sentinela. Como você viu, é uma maneira do Python representar a referência de uma lista dentro de si.
fonte