递归函数默认可变参数

时间:2018-12-21 13:23:10

标签: python

假设您具有以下功能:def f(..., visited= set())

在内部,您再次致电f()

在此递归调用中,如果您不通过访问,是否会创建一个新的访问set()?

1 个答案:

答案 0 :(得分:1)

不。第一次运行def语句时,仅对一次处理默认参数。因此,如果您不为visited传递另一个参数,则相同的集合将被重用,并且通常会导致意外的结果。

来自Python documentation

  

定义范围内,在函数定义时对默认值进行评估 ,以便...

以及下面的重要警告

  

默认值仅计算一次。当默认值是可变对象(例如列表,字典或大多数类的实例)时,这会有所不同。例如,以下函数累积在后续调用中传递给它的参数: