当函数被多次调用时,函数内部定义的变量会被继承

Variable defined inside of function carries over when function is called multiple times

这是在 python。

所以,我定义了一个排序函数:

def function(var1, var2 = [[], 0]):
    # some code that changes both var1 and var2
    return (var2, var1)

然后,我做了一个for循环:

for x in range(10):
    print(function(x))

我在函数内部对 var2 进行了一些更改。我遇到的问题是 var2 内部发生的更改会在涉及 x 的 for 循环中的每个下一次迭代中延续。我不明白为什么要这样做。我修复它的方法是调用它:

for x in range(10):
    print(function(x, [[], 0]))

但是,我不想这样做(每次指定 var2 是 [[], 0])。

此外,如果这可能有帮助,该函数是递归的。它运行良好,只是 var2 继续。

如何防止这种情况发生?

如何防止这种情况发生?使用 tuple 而不是 list var2=((), 0).

说明:指定为默认参数 var2list 存储一次并在每次 调用函数时获取,除非您指定不同的参数作为 var2。因此,当该列表被修改时,下次获取它时,它会携带修改。这就是为什么使用 list 作为默认参数是一种不好的做法,请改用 tuple,因为 tuple 不可变的 .

Python 在代码首次编译时创建一次函数的默认参数,并在需要默认值时使用该对象。一个结果是,如果参数是可变的,比如一个列表,那么对它的任何更改都会在以后的所有调用中看到。一种解决方案是使用不同的值作为默认值并使用它动态创建默认值

def function(var1, var2=None):
    if var2 is None:
        var2 = [[], 0]
    # some code that changes both var1 and var2
    return (var2, var1)

另一种选择是停止就地改变列表,而是 return 一个副本。

from copy import deepcopy

def function(var1, var2=[[], 0]):
    var1 = deepcopy(var1)
    var2 = deepcopy(var2)
    # some code that changes both var1 and var2
    return (var2, var1)