DEL在di中的行为

2024-06-16 10:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码

#! /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。你知道吗

非常感谢您的时间和帮助

托比亚斯


Tags: 方法代码列表mydictprintderdas
2条回答

当你写:

 chili = my_dict[2]

那么chili是对与my_dict[2]相同的对象的引用。所以修改chili将修改my_dict。你知道吗

您可以复制列表:

  chili = list(my_dict[2])

现在del chili[2]不会修改my_dict。你知道吗

是的,这是故意的行为。字典和列表中的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]列表之间共享的对象。你知道吗

可以使用^{} function创建深度副本,它递归地生成对象的副本。你知道吗

相关问题 更多 >