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

Python 当函数被多次调用时,函数内部定义的变量将继续执行,python,python-3.x,function,scoping,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做了一些更改。我遇到的问题是,在涉及x的for循环中,每个下一次迭代都会在var2的内

这是用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
继续运行


我怎样才能防止这种情况发生?

我怎样才能防止这种情况发生?使用
tuple
而不是
list
var2=((),0)


说明:指定为默认参数
var2
list
存储一次,并在每次调用该函数时获取,除非您将另一个参数指定为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)
另一种选择是停止对列表进行适当的修改,而是返回一个副本

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)

您有一个可变参数default
var2=[],0]
。默认值将只实例化一次。如果你有机会,它也会在下一次通话中被更改。为了安全起见,请使用不可变的默认值,如元组。请显示正确的代码。您在函数中对var2所做的更改是在适当的位置修改列表并返回它。通常一个做一个或另一个。此函数是否必须执行原地变异?这会将问题更改为
TypeError:“tuple”对象不支持项分配
,但不能完全消除该问题。