3

次の行動に驚きました。

>>> a=['a','b','c','d','e','f','g']
>>> en=enumerate(a)
>>> list(en)
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g')]
>>> list(en)
[]
>>> # en changed?   let's try that again!
>>> a=['a','b','c','d','e','f','g']
>>> en=enumerate(a)
>>> tuple(en)
((0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g'))
>>> tuple(en)
()
>>> # en changes again?

list()enのデータからリストを作成するだけで、決して変更しないと思いました。と同じtuple()です。しかし、どちらも en に「深い」影響を与えます。list()とについて何か誤解していますかtuple()、それとも誤解していenumerate()ますか? ありがとう。

4

4 に答える 4

6

enumerate() を誤解していると思います。

>>> en=enumerate(a)

データ構造ではなく、ジェネレーター/イテレーターです。'en' を 1 回実行すると、リストを作成してジェネレーターが実行され、何も残っていません。list(en) を再試行すると、最後に到達したイテレータを反復しようとしているため、そこには何もありません。

于 2013-04-24T23:48:46.533 に答える
5

enumerateリストのようなiterableではなく、iteratorを返します。つまり、との戻り値のすべての要素を取得するには、イテレータが使い果たされるまでそのメソッドを繰り返し呼び出します。その後、イテレータは、Python の他のすべてのイテレータと同様に、それ以上要素を生成できなくなります。listtupleenumeratenext()

于 2013-04-24T23:47:53.830 に答える
3

listとについても特別なことは何もありませんtupleenこれは、独自の手書きのforループを介してなど、どのように消費しても発生します。

>>> a=['a','b','c','d','e','f','g']
>>> en=enumerate(a)
>>> en
<enumerate object at 0x21172d0>
>>> for index, elem in en:
...   print index, elem
... 
0 a
1 b
2 c
3 d
4 e
5 f
6 g
>>> for index, elem in en:
...   print index, elem
... 
>>> 

enはリストやタプルではなく「列挙オブジェクト」であり、その印刷はその内容を印刷しようとしなかったことに注意してください。これは、すべて同じデータとインデックス値enumerateを含むデータ構造を実際には生成しないためです。a代わりに、どのコンテナを繰り返し処理していたか、どこまで行ったか、何回に達したかを内部的に記憶する小さなオブジェクトを返します。「次の」値を生成するために必要なのはこれだけなので、それ自体はコンテナーではありませんが、繰り返し処理できます。

この理由は、人々が の結果を保存することはほとんどないためです。通常は、ループenumerateですぐに反復するために呼び出されます。forそのために、すべてのデータのコピーを作成し、すべてのインデックスを一度にメモリに保持する努力をするのは、時間とメモリの無駄です。あなたが行くようにそれらを生成するだけで十分です。

結果のデータをenumerate複数回使用する (または生成した場所以外の場所で使用する) ために保存する必要がある場合は、そのコピーが必要になります。それを取得する最も簡単な方法は、実際に次のようなことを行うことですen = list(enumerate(a))enその後、期待どおりに使用できます。

于 2013-04-25T00:01:56.573 に答える
2

あなたは完全には理解していないかもしれませんenumerate()(または、私が質問を誤解している可能性があります)。help(enumerate)ドキュメントをチェックしてください(具体的には、 indexvalueのペア生成する ことに関する部分:

Help on class enumerate in module __builtin__:

class enumerate(object)
 |  enumerate(iterable[, start]) -> iterator for index, value of iterable
 |
 |  Return an enumerate object.  iterable must be another object that supports
 |  iteration.  The enumerate object yields pairs containing a count (from
 |  start, which defaults to zero) and a value yielded by the iterable argument.
 |  enumerate is useful for obtaining an indexed list:
 |      (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
 |
 |  Methods defined here:
 |
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 |  __iter__(...)
 |      x.__iter__() <==> iter(x)
 |
 |  next(...)
 |      x.next() -> the next value, or raise StopIteration
 |
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |
 |  __new__ = <built-in method __new__ of type object>
 |      T.__new__(S, ...) -> a new object with type S, a subtype of T
于 2013-04-24T23:47:52.503 に答える