Python 当函数被多次调用时,函数内部定义的变量将继续执行
这是用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的内
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”对象不支持项分配
,但不能完全消除该问题。