函数内部定义的变量在多次调用函数时进行

时间:2017-04-18 03:46:24

标签: python python-3.x function scoping

这是在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结转。

如何防止这种情况发生?

2 个答案:

答案 0 :(得分:0)

如何防止这种情况发生?使用tuple代替list var2=((), 0)

说明:指定为默认参数list的{​​{1}} 存储一次并在每次调用函数时被提取,除非您将其他参数指定为var2。因此,当修改该列表时,下次获取该列表时,它会进行修改。这就是使用var2作为默认参数的错误做法,而不是使用list,因为tuple 不可变

答案 1 :(得分:0)

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

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

另一个选择是停止改变列表,但返回一个副本。

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)