我看到了来自here的以下代码。
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
。似乎dict查找( getitem ,或索引,哪一个是正确的术语?)将成为对象的应对?正确?
答案 0 :(得分:5)
您正在查看shelve
模块文档。
shelve.open
返回类似字典的对象,而不是字典。它不会立即加载所有键值对;所以这个例子中的评论是有道理的。
答案 1 :(得分:3)
通常,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
将返回与密钥一起存储的值的副本,因此更改返回值不会更改搁置值。
答案 2 :(得分:0)
对于规范而言,您的实现(即__getitem__
对一种特定类型的对象所做的事情)是令人困惑的(即__getitem__
应该始终做什么的处方)。
__getitem__
只是在x[i]
周围实现语法糖 - 它对实际完成的没有任何要求。 x[i]
只能在字典中返回与i
关联的值。它可以返回一份副本。它可能会导致更多的副作用 - 即它可能导致文件被创建/删除,数据库被连接/断开,对象被创建/删除等等。
对于dict
,__getitem__
被定义为返回原始对象。但是你不应该假设那些语义将适用于实现它的所有其他对象 - 你会感到失望。如果有疑问,你做的是正确的 - 检查文档。