我有兴趣理解为什么列表和元组的行为方式不同,使用递归函数来跟踪决策树分支中使用的参数。
该函数将整数作为输入(字典键)和空元组。将打印键,其对应值和空元组。然后将整数“添加”到元组,并以递归方式对每个值调用函数,将元组传递给used_keys。
data = {0:[1,2,3],1:[4],2:[4],3:[4]}
#
def recursive(key, used_keys=()):
print("used_keys: " + str(used_keys))
print(key, data[key])
used_keys += (key,)
for k in data[key]:
try:
recursive(k, used_keys=used_keys)
except KeyError:
pass
if __name__ == '__main__':
recursive(0)`
在这种情况下,结果如我所料。当第一个键值对中的值[1,2,3]循环时,used_keys显示[0,1],[0,2]和[0,3]。但是,当您使用如下所示的列表替换元组时,行为会更改:
def recursive(key, used_keys=[]):
print("used_keys: " + str(used_keys))
print(key, data[key])
used_keys += [key]
for k in data[key]:
try:
recursive(k, used_keys=used_keys)
except KeyError:
print("End")
在这种情况下,在先前循环中迭代的所有键都保留在used_keys中,键1表示[0,1],键2表示[0,1,2],键3表示[0,1,2,3]
谢谢!