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"