【问题标题】:python "del" statment deletes multiple dictspython“del”语句删除多个字典
【发布时间】:2015-08-11 11:59:58
【问题描述】:

我对 dicts 的 del 语句有问题,因为我得到了多次删除。例如,我的代码如下所示:

info_dict = {'parent1':{'exon':{'exon1':{'str_0':1, 'end_0':1}, 'exon2':{'str_0':2, 'end_0':2}}},'parent2':{'exon':{'exon1':{'str_0':1, 'end_0':1}, 'exon3':{'str_0':3, 'end_0':3}}}}
print info_dict 
#now i want to delete this key: 
del info_dict.get('parent1').get('exon').get('exon1')['end_0']
#as an result i get this: 
print info_dict 
{'parent1':{'exon':{'exon1':{'str_0':1}, 'exon2':{'str_0':2, 'end_0':2}}},'parent2':{'exon':{'exon1':{'str_0':1}, 'exon3':{'str_0':3, 'end_0':3}}}}

如您所见,del 语句从“parent1”中删除了正确的键。但它也会从 dict 'parent2' 中删除相同的键。

在我的代码中,我循环使用以下命令:

for parent_key in info_dict: 
    "check something and del"

如果我像上面那样运行代码,del 语句只会删除一个键。但是当我循环它时,它会删除多个键。我检查了我的代码几次,没关系。在这一点上,我不知道出了什么问题......对不起,我没有向您展示整个代码,它似乎很大。但也许有人知道问题出在哪里。 谢谢你

【问题讨论】:

  • 为什么说info_dict.get('parent1').get('exon').get('exon1')['end_0']而不是info_dict['parent1']['exon']['exon1']['end_0']
  • 您提供的代码不会产生您声称收到的结果。 sscce.org
  • 我刚刚运行了您的代码,del 语句工作正常,您确定您的问题或代码中没有输入错误的内容吗?

标签: python dictionary del


【解决方案1】:

您在实际代码中的某处创建引用dicts,因此当您在一个地方更改时,您会更改所有引用。

d = {1:{2:3}}

d1 = d # creates a reference so d1 id d
print(d)
print(d1)
del d[1]

print(d)
print(d1)

输出:

{1: {2: 3}}
{1: {2: 3}}
{} # both empty as both are the same dict/object
{}

现在用copy.deepcopy制作一个实际的副本:

from copy import deepcopy

d = {1:{2:3}}

d1 = deepcopy(d) # creates a copy/new object
print(d)
print(d1)
del d[1]

print(d)
print(d1)

输出:

{1: {2: 3}}
{1: {2: 3}}
{} # only d is empty as we created a new object for d1
{1: {2: 3}} 

【讨论】:

  • 啊,是的!我仍然不明白为什么 python 会“错误”,因为我使用 del 语句并精确描述了它必须删除哪个键。但是我知道出了什么问题,您的回答帮助我解决了问题。所以非常感谢你,它已经让我发疯了...... :)
猜你喜欢
  • 2013-02-04
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2021-08-10
相关资源
最近更新 更多