抱歉,如果已经被问到但我在知识库中找不到任何答案。 我正在尝试通过递归过程更新字典中的值,下面是代码:
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的内部元素的值)?
我应该跟踪树中的点,然后“评估”表达式吗?或者它是如何做到的?
一开始我喜欢递归过程的想法,因为无论我的树的大小是紧凑的,但现在我面临的问题是我无法更新值: - )
提前致谢,
亚历
答案 0 :(得分:2)
归结为迭代字典时的事实:
for k,v in passeddict.items():
并修改v
,您不修改字典项,您只需为v
分配一个新值。你应该替换:
v=f.readlines()
使用:
passeddict[k] = f.readlines()