当函数被多次调用时,函数内部定义的变量将继续执行

2024-04-25 22:09:35 发布

您现在位置:Python中文网/ 问答频道 /正文

这是用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做了一些更改。我遇到的问题是,在涉及x的for循环中,在var2结转的每个下一次迭代中发生的更改。我不明白为什么会这样。我把它改为:

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

但是,我不希望必须这样做(指定var2每次为[[], 0])。你知道吗

另外,如果这有帮助的话,这个函数是递归的。它运行良好,只是var2继续。你知道吗

我怎样才能防止这种情况发生?你知道吗


Tags: 函数inforthat定义defcoderange
2条回答

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)

我怎样才能防止这种情况发生?用tuple代替listvar2=((), 0)。你知道吗

说明:指定为默认参数listvar2存储一次,并且每次调用函数时都会获取,除非您将另一个参数指定为var2。因此,当该列表被修改时,下次获取它时,它将携带修改。这就是为什么使用list作为默认参数是一种不好的做法,而是使用tuple,因为tuple不可变的。你知道吗

相关问题 更多 >