这是在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
结转。
如何防止这种情况发生?
答案 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)