Будет ли dict getitem создавать копию соответствующего объекта?
Я увидел следующий код из здесь .
d[key] = data # store data at key (overwrites old data if
# using an existing key)
data = d[key] # retrieve a COPY of data at key (raise KeyError if no
# such key)
Я не понимаю, что это значит. Сказано retrieve a COPY of data at key. Кажется, диктант (getitem , или индексация, какой из них является правильным термином?) сделает ли совладание с объектом? Так ведь?3 ответа:
Вы видите документацию по модулю
shelve.
shelve.openвозвращает объект, подобный словарю, а не словарь. Он не загружает все пары ключ-значение сразу; поэтому комментарии в Примере имеют смысл.
Обычно dict lookup возвращает значение, хранящееся в ключе, а не копию значения. Это важно для изменяемых объектов. Например:
A = dict() A["a"] = ["Hello", "world"] # Stores a 2-element list in the dict, at key "a" B = A["a"] # Gets the list that was just stored B[0] = "Goodbye" # Changes the first element of the list print(A["a"][0]) # Prints "Goodbye"Напротив,
shelveвернет копию значения, сохраненного с ключом, поэтому изменение возвращенного значения не изменит отложенное значение.
Вы путаете реализацию (то есть то, что
__getitem__делает для одного конкретного типа объекта) со спецификацией (то есть предписанием того, что__getitem__должно делать все время).
__getitem__просто реализует синтаксический сахар вокругx[i]- он не предъявляет никаких требований к , как это на самом деле делается.x[i]может просто возвращать значение, связанное сiв словаре. Он может вернуть копию. Это может вызвать гораздо больше побочных эффектов-то есть это может привести к созданию/удалению файлов, баз данных подключаться / отключаться, создавать/удалять объекты и т. д.Для
dict,__getitem__определяется для возврата исходного объекта. Но вы не должны предполагать, что эта семантика будет применима ко всем другим объектам, которые ее реализуют - вы будете разочарованы. Если вы сомневаетесь, что поступаете правильно - проверьте документы.