当函数被多次调用时,函数内部定义的变量会被继承
Variable defined inside of function carries over when function is called multiple times
这是在 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
继续。
如何防止这种情况发生?
如何防止这种情况发生?使用 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)
另一种选择是停止就地改变列表,而是 return 一个副本。
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)
这是在 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
继续。
如何防止这种情况发生?
如何防止这种情况发生?使用 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)
另一种选择是停止就地改变列表,而是 return 一个副本。
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)