次の2つのコードスニペットを考えてみましょう。Python 3の "list"呼び出しに奇妙な副作用があります
スニペット1:
l = range(10)
list(l)
m = reversed(l)
list(m)
l = range(-1)
list(l)
list(m)
スニペット2:
l = range(10)
m = reversed(l)
l = range(-1)
list(l)
list(m)
それらの間の唯一の違いは、スニペット2は、その前半にlist(l)
とlist(m)
を呼び出さないということです。
Bizzarely、スニペットでlist(m)
への最終呼び出し1つの戻りこれらは異なる値であるスニペットにlist(m)
への最終呼び出し2つの戻り
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
一方
[]
!
これは予想した動作ではありません。おそらく、スニペット1でのlist(l)
とlist(m)
への以前の呼び出しは、ある種のメモリ最適化を引き起こしています。誰が私に何が起こっているのか正確に説明することができますか?
>>> l = range(10)
>>> list(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> m = reversed(l)
>>> list(m)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> l = range(-1)
>>> list(l)
[]
>>> list(m)
[]
>>>
>>> l = range(10)
>>> m = reversed(l)
>>> l = range(-1)
>>> list(l)
[]
>>> list(m)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
ありがとうございます。
反復子は、 'reversed'の戻り値と同様、使い捨てです。それらを2回反復する場合は、2つのイテレータを取得する必要があります。 – user2357112
ああ、そうです。ありがとうございました。 – Jim