使用递归过程python更新dict中的值

时间:2017-06-28 12:34:14

标签: python dictionary

抱歉,如果已经被问到但我在知识库中找不到任何答案。 我正在尝试通过递归过程更新字典中的值,下面是代码:

 import os

 incmds={
     'ip':{
         'link':{
             'show':[]
         },
         'addr':{
             'show':[]
         },
         'route':{
             'show':[]
         }
     }
 }

 cmd_list=[]

 def go_through_dict(parental_key,passeddict,cmd_list):
     for k,v in passeddict.items():
         t=parental_key+' '+k
         if isinstance(v, dict):
             go_through_dict(t,v,cmd_list)
         else:
             t=t.strip()
             cmd_list.append(t)
             with os.popen(t) as f:
 #                print 'Issueing the command: '+t
                 v=f.readlines()
 #                print 'Result:',v
 ## main ##
 cmd=''
 go_through_dict('',incmds,cmd_list)

 for cmd in cmd_list:
     print cmd

 print incmds

当我运行它时,我看到dict incmds的内部值没有更新。 事实上我最终得到了:

ip route show
ip link show
ip addr show
{'ip': {'route': {'show': []}, 'link': {'show': []}, 'addr': {'show': []}}}

我认为默认情况下变量是通过引用传递的,因此如果我在程序中修改某些内容,一旦它终止,更改应该反映在外部。问题是我不是像传统方式那样修改值

incmds['ip']['addr']['show']=<output of the command>

这只是一个POC,目标确实是将一些操作系统命令描述为dict树,并将输出存储在叶子中。

我应该如何修改我的程序来真正修改树的叶子(意味着dict的内部元素的值)?

我应该跟踪树中的点,然后“评估”表达式吗?或者它是如何做到的?

一开始我喜欢递归过程的想法,因为无论我的树的大小是紧凑的,但现在我面临的问题是我无法更新值: - )

提前致谢,

亚历

1 个答案:

答案 0 :(得分:2)

归结为迭代字典时的事实:

for k,v in passeddict.items():

并修改v,您修改字典项,您只需为v分配一个新值。你应该替换:

v=f.readlines()

使用:

passeddict[k] = f.readlines()