Будет ли 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 2

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