Будет ли 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__
определяется для возврата исходного объекта. Но вы не должны предполагать, что эта семантика будет применима ко всем другим объектам, которые ее реализуют - вы будете разочарованы. Если вы сомневаетесь, что поступаете правильно - проверьте документы.