Когда я читал главу 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].
Так в чем же разница между наличием и отсутствием [:]
после списка?
self.thelist=self.workingcopy
не может изменить содержимоеself.thelist
? - person Xiaoguang Niu   schedule 02.04.2017self.workingcopy
указывает на список. Если вы установитеself.list = self.workingcopy
, он просто укажет на новый список вместо того, чтобы изменить список, на который он указывает. - person Ry-♦   schedule 02.04.2017