dict __getitem__会创建相应对象的副本吗?

时间:2014-02-27 15:42:04

标签: python deep-copy

我看到了来自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 ,或索引,哪一个是正确的术语?)将成为对象的应对?正确?

3 个答案:

答案 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__被定义为返回原始对象。但是你不应该假设那些语义将适用于实现它的所有其他对象 - 你会感到失望。如果有疑问,你做的是正确的 - 检查文档。