考虑以下代码
#! /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']}
如您所见,dict中的列表也被操纵,因此它们似乎指向内存中的同一对象/事物。你知道吗
也许我在这里理解了一个基本的Python原则错误(请随意指出规范),但是这是预期的行为吗?如果是的话,有没有一种方法可以在不操纵原始dict的情况下,从dict的列表中按索引删除和输入内容?我经常发现已经有一种非常简单的Python方法来完成我试图用复杂的代码构造来完成的任务。你知道吗
我这里有一个很大的dict,我经常从中取出列表,我不想每次以任何方式处理列表时都重建dict。你知道吗
非常感谢您的时间和帮助
托比亚斯
当你写:
那么
chili
是对与my_dict[2]
相同的对象的引用。所以修改chili
将修改my_dict
。你知道吗您可以复制列表:
现在
del chili[2]
不会修改my_dict
。你知道吗是的,这是故意的行为。字典和列表中的Python名称和条目只是对实际对象的引用,存储在内存中的一大堆(堆)。你知道吗
因此,
my_dict[2]
和chili
都引用相同的list
对象,并且list
对象是可变的。从list
对象中删除条目意味着对该对象的所有引用都会看到更改。你知道吗如果希望
chili
不是同一个列表对象,则必须创建一个副本。可以使用以下任一方法创建浅层副本:因为从第一个索引到最后一个索引的切片会生成一个新的列表对象,或者使用:
它生成一个新的
list
对象,复制存储在原始序列中的所有引用。你知道吗它们创建浅副本;如果
my_dict[2]
中的任何内容本身是可变的,那么您仍将操作在chili
列表和my_dict[2]
列表之间共享的对象。你知道吗可以使用^{} function 创建深度副本,它递归地生成对象的副本。你知道吗
相关问题 更多 >
编程相关推荐