Список Python: использование [:]

Когда я читал главу 5 книги Python Essential Reference, я столкнулся с проблемой в примере ListTransaction. Вот исходный код:

 class ListTransaction(object):
        def __init__(self,thelist):
            self.thelist=thelist
        def __enter__(self):
            self.workingcopy=list(self.thelist)
            return self.workingcopy
        def __exit__(self,type,value,tb):
            if type is None:
                self.thelist[:]=self.workingcopy
            return False


items=[1,2,3]
with ListTransaction(items) as working:
    working.append(4)
    working.append(5)
print(items) #[1,2,3,4,5]

Он работает так, как ожидалось. Но если я опускаю [:] в определении __exit__(), то есть 9-я строка становится

 self.thelist=self.workingcopy

тогда вывод будет

[1,2,3].

Так в чем же разница между наличием и отсутствием [:] после списка?


person Xiaoguang Niu    schedule 02.04.2017    source источник
comment
Присвоение части списка изменяет список.   -  person Ry-♦    schedule 02.04.2017
comment
Спасибо. Но почему self.thelist=self.workingcopy не может изменить содержимое self.thelist?   -  person Xiaoguang Niu    schedule 02.04.2017
comment
self.workingcopy указывает на список. Если вы установите self.list = self.workingcopy, он просто укажет на новый список вместо того, чтобы изменить список, на который он указывает.   -  person Ry-♦    schedule 02.04.2017