python - Why does `mylist[:] = reversed(mylist)` work? -


the following reverses list "in-place" , works in python 2 , 3:

>>> mylist = [1, 2, 3, 4, 5] >>> mylist[:] = reversed(mylist) >>> mylist [5, 4, 3, 2, 1] 

why/how? since reversed gives me iterator , doesn't copy list beforehand, , since [:]= replaces "in-place", surprised. , following, using reversed, breaks expected:

>>> mylist = [1, 2, 3, 4, 5] >>> i, item in enumerate(reversed(mylist)):         mylist[i] = item >>> mylist [5, 4, 3, 4, 5] 

why doesn't [:] = fail that?

and yes, know mylist.reverse().

cpython list slice assigment convert iterable list first calling pysequence_fast. source: https://hg.python.org/cpython/file/7556df35b913/objects/listobject.c#l611

 v_as_sf = pysequence_fast(v, "can assign iterable"); 

even pypy similar:

def setslice__list_any_any_any(space, w_list, w_start, w_stop, w_iterable):     length = w_list.length()     start, stop = normalize_simple_slice(space, length, w_start, w_stop)     sequence_w = space.listview(w_iterable)     w_other = w_listobject(space, sequence_w)     w_list.setslice(start, 1, stop-start, w_other) 

here space.listview call objspace.unpackiterable unpack iterable in turn returns list.


Comments

Popular posts from this blog

python - TypeError: start must be a integer -

c# - DevExpress RepositoryItemComboBox BackColor property ignored -

django - Creating multiple model instances in DRF3 -