考虑以下代码
#! /usr/bin/env python
my_dict = {1:['Bernd','das','Brot'], 2:['Chili','das','Schaf'], 3:['Briegel','der','Busch']}
print my_dict
chili = my_dict[2]
print chili
del chili[2]
print chili
print my_dict
使用我的 Python 2.7.5 生成以下输出:
{1: ['Bernd', 'das', 'Brot'], 2: ['Chili', 'das', 'Schaf'], 3: ['Briegel', 'der', 'Busch']}
['Chili', 'das']
{1: ['Bernd', 'das', 'Brot'], 2: ['Chili', 'das'], 3: ['Briegel', 'der', 'Busch']}
如您所见,字典中的列表也被操作,因此它们似乎指向内存中的相同对象/事物。
也许我对 Python 基本原理的理解是错误的(请随意批评并指出规范),但这是预期的行为吗?如果是的话,有没有一种方法可以从字典中删除列表并按索引进行条目,而无需操作原始字典?我经常发现已经有一种非常简单的 Python 方法来完成我试图用复杂的代码结构来完成的事情。
我这里有一个很大的字典,我经常从中取出列表,并且我不想每次以任何方式处理列表时都重建字典。
非常感谢您的时间和帮助,
托比亚斯
最佳答案
是的,这是预期的行为。 Python 名称以及字典和列表中的条目仅仅是对实际对象的引用,存储在内存中的一大堆(堆)中。
因此,my_dict[2]
和 chili
都引用同一个 list
对象,并且 list
对象是可变的。从 list
对象中删除条目意味着对该对象的所有引用都会看到更改。
如果您希望 chili
不是同一个列表对象,则必须创建一个副本。您可以使用以下任一方法创建浅副本:
chili = my_dict[2][:]
从第一个索引到最后一个索引的切片会生成一个新的列表对象,或使用:
chili = list(my_dict[2])
生成一个新的list
对象,复制原始序列中存储的所有引用。
这些创建浅副本;如果 my_dict[2]
中的任何内容本身是可变的,您仍然可以操作 chili
列表和 my_dict[2]
列表之间共享的对象.
您可以使用 copy.deepcopy()
function 创建深拷贝,它递归地生成对象的副本。
关于python - DEL 的行为从字典中获取列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21550658/