2016-04-07 9 views
2

nまでの二乗和を計算したかったのですが、次に、このコードは0〜4の範囲のマップオブジェクトのリストを生成します。Python:マップオブジェクト上で 'list'を2回呼び出す

m = map(lambda x: x**2, range(0,4)) 

十分に簡単です。今メートルのリストを呼び出し、その後、合計:

>>> sum(list(m)) 
>>> 14 

予期しない動作が、私は再び最後の行を実行する場合、合計が0であるということである。

>>> sum(list(m)) 
>>> 0 

私はリストを呼び出すためであると思われます(m)は空のリストを返しますが、この動作の説明は見つかりません。誰かがこれで私を助けることができますか?それが枯渇し、何の値が得られないということの後にはPython 3 Generatorで

+1

'map'は、最初の' list'呼び出しで消費される* iterator *です。なぜ 'list(m)'を割り当てて再利用しないのですか? – jonrsharpe

+0

@jonrsharpeはい、私はそれが代案だと思っていますが、なぜこれが起こるのか知りたかったのです。だからあなたはlist()がイテレータを消費すると言っていますか?もっと教えてもらえますか? – ADB

+2

Pythonチュートリアル/ドキュメンテーション* "python iterator" *のGoogle検索ですか? – jonrsharpe

答えて

7

map戻りジェネレータは、一度に消費することができます。あなたのコードで

はあなた発電機を複数回消費スニペット。 list(m)がリストを再作成しようとし、2番目以降の実行では、作成されたリストは常に空です(ソースジェネレータは最初にlist(m)操作で消費されたため)。

単に一度リストする発電機を変換し、その後言っリスト上で動作します。

m = map(lambda x: x**2, range(0,4)) 
l = list(m) 
assert sum(l) == 14 
assert sum(l) == 14 
+0

ありがとう、これは私が探していた情報です。 – ADB

+0

ジェネレータでこの動作を避けたい場合は、マップをスキップして、リストの理解度を使用してリストに直接進むことができます。 'm = [xの範囲(4)のxの2] ' –

+0

@タイラーあなたは正しいですが、私はこの特定の振る舞いについての洞察も得ようとしていました。 – ADB

関連する問題