valor utiliza una resultado referencia recibir qué procedimientos por paso pasar parametros parametro para objeto lista función funciones consola como python recursion ellipsis recursive-datastructures

utiliza - ¿Qué quiere decir Python al imprimir "[...]" para una referencia de objeto?



qué función de python se utiliza para el resultado de la consola (4)

Dependiendo del contexto aquí podría haber cosas diferentes:

indexar / rebanar con Ellipsis

Creo que no está implementado para ninguna clase de python, pero debería representar una cantidad arbitraria de anidamientos de estructuras de datos ( tanto como sea necesario ). Entonces, por ejemplo: a[..., 1] debería devolver todos los segundos elementos de la estructura anidada más interna:

>>> import numpy as np >>> a = np.arange(27).reshape(3,3,3) # 3dimensional array >>> a[..., 1] # this returns a slice through the array in the third dimension array([[ 1, 4, 7], [10, 13, 16], [19, 22, 25]]) >>> a[0, ...] # This returns a slice through the first dimension array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])

y para verificar esto ... lo comparas con una Ellipsis (este es un singleton, así que lo que se recomienda es usar is :

>>> ... is Ellipsis True >>> Ellipsis in [...] True # Another (more or less) equivalent alternative to the previous line: >>> any(i is Ellipsis for i in [1, ..., 2]) True

Recursive Datastructures

El otro caso en el que ve un [...] en su salida es si tiene la secuencia dentro de la secuencia misma. Aquí representa una secuencia infinita profundamente anidada (que no es imprimible). Por ejemplo:

>>> alist = [''a'', ''b'', ''c''] >>> alist[0] = alist >>> alist [[...], ''b'', ''c''] # Infinite deeply nested so you can use as many leading [0] as you want >>> alist[0][1] ''b'' >>> alist[0][0][0][0][0][1] ''b'' >>> alist[0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][1] ''b''

Incluso puedes reemplazarlo varias veces:

>>> alist[2] = alist >>> alist [[...], ''b'', [...]] >>> alist[1] = alist >>> alist [[...], [...], [...]]

Para probar si tiene alguna recursión de ese tipo en su salida, debe verificar si la estructura de datos en sí misma también es uno de los elementos:

>>> alist in alist True >>> any(i is alist for i in alist) True

Otra forma de obtener un resultado más significativo es utilizando pprint.pprint :

>>> import pprint >>> pprint.pprint(alist) # Assuming you only replaced the first element: [<Recursion on list with id=1628861250120>, ''b'', ''c'']

Estoy imprimiendo un valor de lo que pensé que era una lista, pero el resultado que obtengo es:

[...]

¿Qué representa esto? ¿Cómo lo pruebo? He intentado:

myVar.__repr__() != ''[...]''

y

myVar.__repr_() != Ellipsis

pero no dados ...

Aquí hay un resumen del código que está dando el problema:

def buildPaths(graph, start, end, path=[], totalPaths=[]): """ returns list of all possible paths from start node to the end node """ path = path + [start] if start == end: return path for nextNode in graph.childrenOf(start): if nextNode not in path: newPath = buildPaths(graph, nextNode, end, path, totalPaths) if newPath != []: # test totalPaths.append(newPath) return totalPaths

TotalPaths contiene MUCHAS [...] listas supuestamente recursivas, pero no puedo ver por qué. He alterado la prueba en #test para evitar esto.

También lo intenté:

def buildPaths(graph, thisNode, end, path=[], totalPaths=None): """ returns list of all possible paths from start node to the end node """ path = path + [thisNode] if thisNode == end: return path for nextNode in graph.childrenOf(thisNode): if nextNode not in path: newPath = buildPaths(graph, nextNode, end, path, totalPaths) if newPath != None: if totalPaths == None: totalPaths = [newPath] else: totalPaths.append(newPath) return totalPaths

para devolver explícitamente None para rutas vacías.


Es una referencia recursiva ya que su lista se contiene a sí misma. Python no intenta imprimir esto recursivamente, lo que daría lugar a un ciclo infinito.

repr detecta esto. Entonces, si observas la representación interna de tu objeto de lista, verás (donde ocurren las elipsis) "Referencia al mismo objeto de lista en la dirección *" donde * es la dirección del objeto de lista original en la memoria. Por lo tanto, el bucle infinito.


Representa un ciclo infinito dentro de la estructura. Un ejemplo:

In [1]: l = [1, 2] In [2]: l[0] = l In [3]: l Out[3]: [[...], 2]

El primer artículo es en sí mismo. Es una referencia recursiva, por lo que Python no puede mostrar razonablemente su contenido. En cambio, muestra [...]


Si su lista contiene referencias automáticas, Python la mostrará como [...] lugar de tratar de imprimirla recursivamente, lo que daría lugar a un bucle infinte:

>>> l = [1, 2, 3] >>> print(l) [1, 2, 3] >>> l.append(l) >>> print(l) [1, 2, 3, [...]] >>> print(l[-1]) # print the last item of list l [1, 2, 3, [...]] >>> print(l[-1][-1]) # print the last item of the last item of list l [1, 2, 3, [...]]

indefinidamente.

Una situación similar surge con los diccionarios:

>>> d = {} >>> d[''key''] = d >>> print(d) {''key'': {...}} >>> d[''key''] {''key'': {...}} >>> d[''key''][''key''] {''key'': {...}}