Calling Python 3 for a "list" has odd side effects

Consider the following two code fragments.

Fragment 1 :

l = range(10)
list(l)
m = reversed(l)
list(m)
l = range(-1)
list(l)
list(m)

Fragment 2 :

l = range(10)
m = reversed(l)
l = range(-1)
list(l)
list(m)

The only difference between them lies in the fact that does not cause Snippet 2 list(l)and list(m)in its first half.

In Bizzarely, the final challenge list(m)in Snippet 1 returns

[] 

whereas the final call list(m)in Snippet 2 returns

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]  

These are different meanings!

This is not the behavior that I expected. Presumably, previous calls list(l)and list(m)in some Snippet 1 trigger memory optimization; can anyone explain to me exactly what is going on, please?

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

Thank.

+4
1

reversed , : , list ( ).

, m, , :

m = reversed(l)
print(m) # <list_reverseiterator at 0x7fd2b8518fd0>
list(m)  # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
list(m)  # []  (exhausted)

list m, , .

, , .

+4

Source: https://habr.com/ru/post/1659656/


All Articles