web-dev-qa-db-ja.com

Pythonは、オブジェクト参照に対して「[...]」を出力することで何を意味しますか?

私はリストだと思ったものの値を出力していますが、出力は次のとおりです。

[...]

これは何を表していますか?どうすればテストできますか?私はもう試した:

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

そして

myVar.__repr_() != Ellipsis

しかし、サイコロはありません...

これは問題を引き起こしているコードのカットダウンです:

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には[...]と思われる再帰的なリストがたくさん含まれていますが、その理由はわかりません。これを防ぐために#testでテストを変更しました。

私も試しました:

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

空のパスに対してNoneを明示的に返すため。

48
Dycey

ここのコンテキストに応じて、それは異なるものになる可能性があります。

Ellipsisを使用したインデックス作成/スライス

pythonクラスでは実装されていませんが、shouldは、データ構造のネストの任意の数を表します(必要なだけ)したがって、たとえば:a[..., 1]は、最も内側のネストされた構造の2番目の要素をすべて返す必要があります。

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

この...を確認するには、Ellipsisと比較します(これはシングルトンなので、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

再帰的なデータ構造

your output[...]が表示されるもう1つのケースは、シーケンス自体の中にシーケンスがある場合です。ここでは、infinite深くネストされたシーケンスを表しています(これは印刷できません)。例えば:

>>> 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'

数回交換することもできます:

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

出力にそのような再帰があるかどうかをテストするには、データ構造自体も要素の1つであるかどうかを確認する必要があります。

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

より意味のある出力を取得する別の方法は、pprint.pprintを使用することです。

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

これは、構造内の無限ループを表します。例:

In [1]: l = [1, 2]

In [2]: l[0] = l

In [3]: l
Out[3]: [[...], 2]

lの最初のアイテムはそれ自体です。これは再帰的な参照なので、pythonは内容を合理的に表示できません。代わりに[...]

48
Nolen Royalty

リストに自己参照が含まれている場合Pythonは、それを再帰的に出力しようとするのではなく、[...]として表示します。これにより、無限ループが発生します。

>>> 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, [...]]

無限に。

辞書でも同様の状況が発生します。

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

リスト自体が含まれているため、再帰的な参照です。 Pythonはこれを再帰的に出力しようとしないため、無限ループが発生します。

reprがこれを検出します。したがって、リストオブジェクトの内部表現を見ると(省略記号が発生するところ)、「アドレス*にある同じリストオブジェクトへの参照」がわかります。ここで*は、メモリ内の元のリストオブジェクトのアドレスです。したがって、無限ループです。

11
Pythonista