Inside, this is a big difference:
>>>a = [3, 2] >>>a[0:1][0] = 1
is short for
temp = a[0:1] temp[0] = 1
and internally expressed as
a.__getitem__(slice(0, 1)).__setitem__(0, 1)
respectively.
temp = a.__getitem__(slice(0, 1)) temp.__setitem__(0, 1)
therefore, it accesses part of the list, creates a separate object, and assigns that object, which is then discarded.
Oto
>>>a[0:1] = [1]
does
a.__setitem__(slice(0, 1), [1])
which only works with the source object.
Thus, with the same view, these expressions differ from what they mean.
Let me verify that:
class Itemtest(object): def __init__(self, name): self.name = name def __repr__(self): return self.name def __setitem__(self, item, value): print "__setitem__", self, item, value def __getitem__(self, item): print "__getitem__", self, item return Itemtest("inner") a = Itemtest("outer") a[0:1] = [4] temp = a[0:1] temp[0] = 4 a[0:1][0] = 4
exits
__setitem__ outer slice(0, 1, None) [4] __getitem__ outer slice(0, 1, None) __setitem__ inner 0 4 __getitem__ outer slice(0, 1, None) __setitem__ inner 0 4