2017-12-22 1 views
2

サンプルコード:上記のコードを使用してなぜこのプリントが次の結果を変更しますか?

p = map(some_logic) 
print(list(p)) # HERE 
p = filter(some_logic, p) 
print(list(p)) 

、最初の行によって生成pは常に同じです。しかし、コメント行にを追加すると、、最後のプリントは[]と出力されます。 ここには行がなければ、最後のprintpの正しい内容を示します。

この原因は何ですか?

答えて

3

あなたがmapの結果を使用する場合、それが消費される呼び出し:

>>> p = map(int, ['1', '2']) 
>>> p 
<map object at 0x02C878B0> 
>>> list(p) 
[1, 2] 
>>> list(p) 
[] 

あなたが代わりにlistmapを変更した結果格納する必要があります:

>>> p = list(map(int, ['1', '2'])) 
>>> p 
[1, 2] 
>>> p = list(filter(lambda x: x == 1, p)) 
>>> p 
[1] 

注同じことをfilterで発生しますので、私はlistに変更しました。

+0

ありがとうございました。 Pythonの副作用を認識していませんでした。 – Magicloud

+0

@Magicloudそれは副作用ではないので、 'map'と' filter'はリストの代わりにイテレータを返します。例えば、for..inループで使用することができます。一度に結果を得る。 –

+0

なぜPython3にそれらのMap/Filterオブジェクトがあるのか​​分かります。奇妙なことの1つは、リスト(オブジェクトを通過)の後で、エラーを出さずにオブジェクトを再びリストすることができますが、予期せぬ結果です。 – Magicloud

関連する問題