Python dict\uuu getitem\uuu会创建相应对象的副本吗?

Python dict\uuu getitem\uuu会创建相应对象的副本吗?,python,deep-copy,Python,Deep Copy,我从中看到了以下代码 我不明白这样做的意义。据说,在键处检索数据副本。dict查找(getitem,或索引,哪一个是合适的术语?)似乎会对对象产生影响?对吗?您看到的是搁置模块文档 shelve.open返回类似字典的对象,而不是字典。它不会一次加载所有键值对;因此,示例中的注释是有意义的。通常,dict lookup返回存储在键中的值,而不是该值的副本。这对于可变对象很重要。例如: A = dict() A["a"] = ["Hello", "world"] # Stores a 2-elem

我从中看到了以下代码


我不明白这样做的意义。据说,
在键
处检索数据副本。dict查找(getitem,或索引,哪一个是合适的术语?)似乎会对对象产生影响?对吗?

您看到的是
搁置
模块文档


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
将返回与键一起存储的值的副本,因此更改返回值不会更改shelved值。

您混淆了规范的实现(即
\uu getitem\uuuuuu>对一种特定类型的对象所做的操作)(即,
\uuu getitem\uuu
应该一直做的事情的处方)

\uuu getitem\uuu
只是围绕
x[i]
实现语法糖化-它不要求实际如何实现
可以只返回字典中与
i
关联的值。它可以返回一个副本。它可能会导致更多的副作用,例如,它可能导致创建/删除文件、连接/断开数据库、创建/删除对象等


对于
dict
\uuu getitem\uuuu
被定义为返回原始对象。但是你不应该假设这些语义将适用于实现它的所有其他对象-你会失望的。如果有疑问,你是在做正确的事情-检查文档。

我很感激你用非常清晰和明确的措辞回答。什么我实际上想知道的是关于内置类型dict的实现。好的,这更清楚。如果你做了
mydict={};x=;mydict['x']=x
,那么
x
mydict['x']
指向同一个对象;它返回原始引用,而不是副本。此外,我应该指出,这是“正常”行为——大多数时候,当对象实现
\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo值得一提。
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"