Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使字典充当递归函数的局部变量_Python_Dictionary_Recursion_Local - Fatal编程技术网

Python 使字典充当递归函数的局部变量

Python 使字典充当递归函数的局部变量,python,dictionary,recursion,local,Python,Dictionary,Recursion,Local,我有一个递归函数,以字典作为参数, 函数在调用自身之前更改字典。我希望字典的更改只影响被调用的函数,而不影响范围之外的任何内容 我可以创建本地词典吗 dict={10:5,20:5} 定义递归函数(dict参数、total参数): dict_local=dict_arg 对于dict_local.items()中的k,v: 总计=总计参数+k 如果总数>=25: dict_local.update({k:v-1}) 打印(str(总计)+str(dict_本地)) 其他: dict_local.

我有一个递归函数,以字典作为参数, 函数在调用自身之前更改字典。我希望字典的更改只影响被调用的函数,而不影响范围之外的任何内容

我可以创建本地词典吗

dict={10:5,20:5}
定义递归函数(dict参数、total参数):
dict_local=dict_arg
对于dict_local.items()中的k,v:
总计=总计参数+k
如果总数>=25:
dict_local.update({k:v-1})
打印(str(总计)+str(dict_本地))
其他:
dict_local.update({k:v-1})
递归函数(dict\u local,total)
打印(“功能之前的指令:+str(指令))
递归函数(dict,0)
打印(“函数后面的dict:+str(dict))
终端>>>
在func之前的dict:{10:5,20:5}
30{10: 2, 20: 5}
40{10: 2, 20: 4}
30{10: 2, 20: 3}
30{10: 1, 20: 2}
40{10: 1, 20: 1}
函数后的dict:{10:1,20:1}
如图所示,函数完成后,字典发生了变化,打印的总数与字典中剩余的10和20的对应量不匹配。

请查看
copy()
操作符。这里可能不需要
deepcopy()

您可以使用以下代码:

test_dict = {10 : 5, 20 : 5}

def recursive_func(dict_arg, total_arg):
    dict_local = test_dict.copy()

    for k, v in dict_local.items():
        total = total_arg + k
        if total >= 25:
            dict_local.update({k : v -1})
            print(str(total) + str(dict_local))
        else:
            dict_local.update({k : v -1})
            recursive_func(dict_local, total)

print("dict before func: ", str(test_dict))
recursive_func(test_dict, 0)
print("dict after func: ", str(test_dict))
产生:

dict before func:  {10: 5, 20: 5}
30{10: 4, 20: 5}
40{10: 4, 20: 4}
30{10: 4, 20: 4}
30{10: 4, 20: 5}
40{10: 4, 20: 4}
dict after func:  {10: 5, 20: 5}

你需要制作一份深度副本,否则它只会被引用,每次更改副本时都会更改原始副本

import copy

dict_local = copy.deepcopy(dict_arg)
这应该行得通。正如Jerry M.指出的那个样,你们可能不需要深度拷贝,因为你们的dict值只是整数。有关
copy
deepcopy
之间的差异,请参见示例。

dict={10:5,20:5}
定义递归函数(dict参数、total参数):
对于dict_arg.items()中的k,v:
dict_local=dict_arg.copy()
总计=总计参数+k
如果总数>=25:
dict_local.update({k:v-1})
打印(str(总计)+str(dict_本地))
其他:
dict_local.update({k:v-1})
递归函数(dict\u local,total)
打印(“功能之前的命令:,str(命令))
递归函数(dict,0)
打印(“函数后面的dict:,str(dict))
>>>
在func之前的dict:{10:5,20:5}
30{10: 2, 20: 5}
40{10: 3, 20: 4}
30{10: 4, 20: 4}
30{10: 4, 20: 4}
40{10: 5, 20: 3}
函数后的dict:{10:5,20:5}

dict\u local=dict\u arg.copy()
(或者
copy.deepcopy(dict\u arg)
如果您使用嵌套的dict,而浅拷贝是不够的)这里的问题根本不在范围之内。谢谢,我猜这是一个很容易解决的问题:),如果它对您有效,我会在我的主代码中尝试一下,请记住将此作为答案接受,以便具有相同问题的其他人稍后可以引用它:)。快乐编码!为什么你把这个作为正确答案删除了@这只是我发布的代码的副本。如果我发布的内容解决了您的问题,请将其标记为正确,以供其他人将来使用:)@Floxxy