我有这个代码片段
def fun(i = []):
print("i is", i)
i.append(1)
for k in range(5):
print("k is", k)
fun()
及其输出
k is 0
i is []
k is 1
i is [1]
k is 2
i is [1, 1]
k is 3
i is [1, 1, 1]
k is 4
i is [1, 1, 1, 1]
我今天的理解是,对于每个函数调用,如果没有提供明确的值,参数将使用其默认值。但是在这里,即使在从循环中调用
i
时没有为 fun
提供任何值之后,您也可以看到 i
相对于先前的函数调用正在更新。
我期待这样的答案:
k is 0
i is []
k is 1
i is []
k is 2
i is []
k is 3
i is []
k is 4
i is []
我们在那个函数调用中没有函数参数的范围吗?
Python 中函数的默认可变参数并不是每次调用函数时都真正初始化。相反,最近分配给它们的值被用作默认值。
避免由于可变参数引起的错误的常见做法是将 None 分配为默认值,然后检查是否有任何值传递给与该参数对应的函数。例子:
def some_func(default_arg=None):
if default_arg is None:
default_arg = []
default_arg.append("some_string")
return default_arg
来源:wtfpython